我正在运行Spring MVC 3.x,我有一个带 RequestMapping 注释的控制器( DefaultAnnotationHandlerMapping ),我有一个 ServletForwardingController 通过 SimpleUrlHandlerMapping 进行一些额外的映射。当我启动我的应用程序时,我看到以下内容:
...
13:24:17,747 INFO [DefaultAnnotationHandlerMapping] Mapped URL path [/{query}] onto handler [com.foo.controllers.BarController@1b20a36]
13:24:17,997 INFO [SimpleUrlHandlerMapping] Root mapping to handler [org.springframework.web.servlet.mvc.ParameterizableViewController@598535]
13:24:18,044 INFO [SimpleUrlHandlerMapping] Mapped URL path [/spring*.ftl] onto handler [org.springframework.web.servlet.mvc.ServletForwardingController@56eb62]
13:24:18,044 INFO [SimpleUrlHandlerMapping] Mapped URL path [/shared-resources/**] onto handler [org.springframework.web.servlet.mvc.ServletForwardingController@56eb62]
...
我的BarController当然会捕获所有请求(例如/spring_en_US.ftl),但我希望最后一次尝试。换句话说,我希望 SimpleUrlHandlerMapping 优先于我的应用程序中的 DefaultAnnotationHandlerMappings 。
答案 0 :(得分:2)
我找到的最佳解决方案是使用显式 DefaultAnnotationHandlerMapping 和 AnnotationMethodHandlerAdapter bean配置替换 mvc:annotation-config 。然后,我可以在 SimpleUrlHandlerMapping (order = 0)和 DefaultAnnotationHandlerMapping (order = 1)上设置 order 属性。这根据我的需要设置了处理程序的优先级。
我尝试重新排序 SimpleUrlHandlerMapping 下面的 mvc:annotation-config ,但它并未根据需要更改处理程序优先级。
答案 1 :(得分:0)
DispatcherServlet
应该按照bean文件中声明的顺序查询各种HandlerMapping
bean。第一个说“是的,我有一个映射”获得了奖项。
如果您手动声明SimpleUrlHandlerMapping
和DefaultAnnotationHandlerMapping
,请确保它们的顺序正确。
如果您没有自己声明,那么Spring将使用默认值,即BeanNameUrlHandlerMapping
后跟DefaultAnnotationHandlerMapping
。