Я выполняю 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 в моем приложении.
Лучшим решением, которое я нашел, была замена mvc: annotation-config явным DefaultAnnotationHandlerMapping и Bean-компонент конфигурации AnnotationMethodHandlerAdapter . Затем я смог установить свойство order как для SimpleUrlHandlerMapping (порядок = 0), так и для DefaultAnnotationHandlerMapping (порядок = 1). Это установило приоритет обработчиков, как мне было нужно.
Я попытался переупорядочить mvc: annotation-config ниже SimpleUrlHandlerMapping , но это не изменило приоритет обработчика по мере необходимости.
DispatcherServlet
должен обращаться к различным bean-компонентам HandlerMapping
в том порядке, в котором они объявлены в файле beans. Первый, кто говорит: «Да, у меня есть карта для этого», получает приз.
Если вы вручную объявляете SimpleUrlHandlerMapping
и DefaultAnnotationHandlerMapping
, убедитесь, что они расположены в правильном порядке.
Если вы не объявляете их самостоятельно, Spring будет использовать значения по умолчанию, которыми является BeanNameUrlHandlerMapping
, за которым следует DefaultAnnotationHandlerMapping
.