Статьи

Spring MVC — Настройка RequestMappingHandlerMapping

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