在尝试在弹簧控制器中为@RequestMapping创建某个URL时,我遇到了一些困难。 首先,由于项目使用的框架,有一个控制器方法映射到以下URL:" / {pageLabelOrId} "
其次,我有另一个控制器方法映射到" / {pageName} .html "。这很好用,这意味着如果我尝试从浏览器访问" www.applicationUrl / something.html "如果按照预期的第二种方法捕获此URL。
现在这是我的问题。我必须采用不同的方法处理不同但又相似的网址,如下所示:" / something- {parameter1} _ {parameter2} _ {parameter3} " 试图访问" www.applicationUrl / something-1_2_3 "将触发第一个控制器:" / {pageLabelOrId} "而不是想要的那个。
处理此类网址(" / something-1_2_3 ")是一项要求,我无法将其更改为" / something / {参数1} / {参数2} / {参数3} "我相信它会奏效。
然而,我观察到,编写一个控制器方法映射到" / something- {param} "将工作,并将我的三个参数捕获在一个PathVariable(如" 1_2_3"),然后我可以解析" _"。
有没有人知道为什么spring有这种行为,如果我能以某种方式让它使用三个不同的路径变量?
答案 0 :(得分:0)
Spring 3.1+使用RequestMappingHandlerMapping
创建RequestMappingInfo
个对象,这些对象将控制器处理程序方法映射到相应的@RequestMapping
路径。当DispatcherServlet
收到请求时,它会再次使用RequestMappingHandlerMapping
来确定应该使用哪种处理方法。
当前实现的方式是,它找到与请求匹配的所有已注册RequestMappingInfo
个对象,然后根据一些规则对它们进行排序,基本上是AntPathMatcher
和{{1}中定义的规则}。
您必须将AntPatternComparator
bean配置为使用自定义RequestMappingHandlerMapping
并使用您自己的规则进行比较。
如何执行此操作取决于您的配置方式。如果您使用PathMatcher
课程,则可以
@Configuration
此@Configuration
public class WebConfig extends WebMvcConfigurationSupport {
...
@Override
public RequestMappingHandlerMapping requestMappingHandlerMapping() {
RequestMappingHandlerMapping mapping = super.requestMappingHandlerMapping();
mapping.setPathMatcher(pathMatcher()); // some PathMatcher bean
return mapping;
}
...
}
创建的RequestMappingInfo
个对象将在内部使用此RequestMappingHandlerMapping
。它们将根据其PathMatcher
进行排序。