Spring SimpleUrlHandlerMapping:Pattern不匹配URL

时间:2014-04-01 10:19:06

标签: spring url-mapping

我有以下mappping:

<bean id="controllerMappingProperties" class="java.util.Properties">
    <constructor-arg>
        <props>
            <prop key="/service/q-*-fltr-brand-_-*-find-html.html">redirectController</prop>
            <prop key="/service/q">queryController</prop>
            <prop key="/service/q-*.html">queryController</prop>
        </props>
    </constructor-arg>
</bean>

所以网址

http://localhost:8080/service/q-foo-fltr-brand-_-bar-find-html.html

应映射到redirectController,但它映射到queryController。

如果我将第一个映射更改为

<prop key="/service/q-*-fltr-brand-_-bar-find-html.html">redirectController</prop>`
or
<prop key="/service/q-foo-fltr-brand-_-*-find-html.html">redirectController</prop>

映射工作正常。

在模式中使用两个单星可以与其他映射一起使用,因此无法解决问题。我做错了什么?

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

几天前我遇到了a similar question。问题在于AntPatternComparator,它用于对匹配路径的集合进行排序。

在您的情况下,将您的路径从/service/q-*.html更改为/service/q-**.html。它没有最有意义,但应该有效。


如果查看RequestMappingInfo.getMatchingCondition获取当前请求的匹配条件的方法,您将看到以下注释,其中指出最佳匹配模式将在列表中排在第一位。

Spring 4来源

/**
 * Checks if all conditions in this request mapping info match the provided request and returns
 * a potentially new request mapping info with conditions tailored to the current request.
 * <p>For example the returned instance may contain the subset of URL patterns that match to
 * the current request, sorted with best matching patterns on top.
 * @return a new instance in case all conditions match; or {@code null} otherwise
 */
@Override
public RequestMappingInfo getMatchingCondition(HttpServletRequest request) {
        // ...
}

AntPatternComparator基本上依赖于模式中存在的*{的数量。如果它们的数字相同,则将比较模式长度。使用AntPatternComparator/service/q-foo-fltr-brand-_-*-find-html.html路径进行排序时,/service/q-*.html路径将根据长度大于/service/q-*.html。因此/service/q-**.html将以最终结束。

添加额外的通配符会使{{1}}最大,因为它的通配符数更高。