Когда Spring MVC конфигурируется с использованием <mvc: annotation-driven /> в файле определения bean-компонента xml, внутренний компонент RequestMappingHandlerMapping регистрируется в Spring MVC. Этот компонент или вообще компонент HandlerMapping отвечает за маршрутизацию URI запроса к обработчикам, которые являются методами контроллера, аннотированными аннотацией @RequestMapping.
В RequestMappingHandlerMapping есть две конкретные конфигурации, которые могут быть не интуитивными:
Первой конфигурацией является ‘useSuffixPatternMatch’, которая, если, скажем, uri ‘/ members’ сопоставляется с методом для возврата списка сущностей, ‘/members.xyz’ сопоставляется с тем же методом-обработчиком.
Вторая конфигурация — это useTrailingSlashMatch, которая заключается в том, что «/ members» и «/ members /» будут отображаться в один и тот же метод-обработчик
Если эти два поведения необходимо изменить, способ сделать это — настроить RequestMappingHandlerMapping.
Если <mvc: annotation-driven /> использовался для определения RequestMappingHandlerMapping, тогда громоздким способом было бы удалить <mvc: annotation-driven /> и вместо этого сконфигурировать Spring MVC, расширив компоненты, которые получают зарегистрирован пользовательским обработчиком пространства имен, обрабатывающим пространство имен ‘mvc’, что-то вроде этого (это не завершено и показано только для демонстрации сложности конфигурации):
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
< bean name = 'handlerAdapter' class = 'org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter' > < property name = 'webBindingInitializer' > < bean class = 'org.springframework.web.bind.support.ConfigurableWebBindingInitializer' > < property name = 'conversionService' ref = 'conversionService' ></ property > < property name = 'validator' > < bean class = 'org.springframework.validation.beanvalidation.LocalValidatorFactoryBean' /> </ property > </ bean > </ property > < property name = 'messageConverters' > < list > < bean class = 'org.springframework.http.converter.ByteArrayHttpMessageConverter' /> < bean class = 'org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter' /> < bean class = 'org.springframework.http.converter.json.MappingJackson2HttpMessageConverter' /> < bean class = 'org.springframework.http.converter.StringHttpMessageConverter' ></ bean > < bean class = 'org.springframework.http.converter.ResourceHttpMessageConverter' ></ bean > < bean class = 'org.springframework.http.converter.xml.SourceHttpMessageConverter' ></ bean > < bean class = 'org.springframework.http.converter.xml.XmlAwareFormHttpMessageConverter' ></ bean > </ list > </ property > </ bean > < bean name = 'handlerMapping' class = 'org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping' > < property name = 'useTrailingSlashMatch' value = 'false' ></ property > </ bean > |
Это определенно не хороший способ изменить конфигурацию. Вместо этого, если возникнет необходимость настроить RequestMappingHandlerMapping, гораздо лучшим подходом будет перенести часть или всю конфигурацию web-mvc в Java @Configuration следующим образом:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
|
package mvcsample.spring; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport; import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping; @Configuration public class WebConfig extends WebMvcConfigurationSupport{ @Bean public RequestMappingHandlerMapping requestMappingHandlerMapping() { RequestMappingHandlerMapping handlerMapping = super .requestMappingHandlerMapping(); handlerMapping.setUseSuffixPatternMatch( false ); handlerMapping.setUseTrailingSlashMatch( false ); return handlerMapping; } } |
и импортировать эту конфигурацию в остальную часть конфигурации xml (есть и другие документированные способы):
1
2
3
4
5
6
|
< bean class = 'mvcsample.spring.WebConfig' /> <!-- <mvc:annotation-driven> </mvc:annotation-driven> --> |
Таким образом, @Configuration предоставляет более простой механизм настройки компонентов в Spring MVC, и настоятельно рекомендуется перейти с конфигурации на основе xml на конфигурацию Java для упрощения конфигурации и управления настройками.
Ссылка: Spring MVC — Настройка RequestMappingHandlerMapping от нашего партнера JCG Биджу Кунджуммена в блоге all and sundry.