Когда 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;@Configurationpublic 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.