在RequestMapping问题中使用@PathVariable的控制器的特定URL

时间:2014-04-15 14:46:52

标签: java spring spring-mvc url-routing

在尝试在弹簧控制器中为@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有这种行为,如果我能以某种方式让它使用三个不同的路径变量?

1 个答案:

答案 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进行排序。