如何设置Spring MVC映射的优先级?

我有2个弹簧控制器映射:

@Controller public class ContentController { @RequestMapping(value = "**/{content}.html") public String content(@PathVariable String content, Model model, HttpServletRequest request) { } } @Controller public class HomeController { @RequestMapping(value = "**/home") public String home(HttpServletRequest request, Model model) { } } 

以下url匹配两个映射:/home.html

但是,我想确保’内容’映射始终优先于’home’映射。 有没有办法可以指明?

我最近有类似的问题,我有两种不明确的URL:

  • 一个人接受了一年,比如/2012/2013等。我使用正则表达式映射创建它,如下所示: @RequestMapping("/{year:(?:19|20)\\d{2}}")
  • 另一个是接受内容标识符(aka slug)。 我使用@RequestMapping("/{slug}")类的映射创建了它。

重要的是,“年”控制器方法优先于“slug”控制器方法。 不幸的是(对我来说)Spring总是使用“slug”控制器方法。

由于Spring MVC更喜欢更具体的映射,我不得不使我的“slug”模式不那么具体 。 根据路径模式比较文档,我在slug映射中添加了通配符: @RequestMapping("/{slug}**")

我的控制器看起来像这样,现在当一年( /2012/1998等)在URL中时调用listByYear

 @Controller public class ContentController { @RequestMapping(value = "/{slug}**") public String content(@PathVariable("slug") final String slug) { return "content"; } } 

 @Controller public class IndexController { @RequestMapping("/{year:(?:19|20)\\d{2}}") public String listByYear() { return "list"; } } 

这并不是如何设置优先级(在我看来这将是一个惊人的function),但提供某种“好”的解决方法,并可能在将来方便。

URL映射由发现映射的顺序决定。

因此,您可以强制在另一个控制器之后的spring上下文中创建一个控制器。

这可以使用bean定义中的depends-on =“”属性(在xml中)来完成。

我不确定它是使用它找到的第一个映射还是最后一个映射。

而且,这只是理论,我还没有尝试过。

我看到这样的日志消息:

 17:29:01.618 [main] INF S oswshSimpleUrlHandlerMapping - Mapped URL path [/resources/**] onto handler 'org.springframework.web.servlet.resource.ResourceHttpRequestHandler#0' 17:29:01.625 [main] INF S oswshSimpleUrlHandlerMapping - Mapped URL path [/**] onto handler 'org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler#0' 

所以值得在SimpleUrlHandlerMapping上看看它是如何工作的。

此url(/home.html)与两个映射都不匹配:

  @RequestMapping(value = "**/{content}.html") ... @RequestMapping(value = "**/home") … 

它只匹配第一个,因为它有一个后缀“ .html ”!