我有以下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>
映射工作正常。
在模式中使用两个单星可以与其他映射一起使用,因此无法解决问题。我做错了什么?
感谢您的帮助!
答案 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}}最大,因为它的通配符数更高。