在xml bean定義文件中使用<mvc:annotation-driven />配置Spring MVC時,在內部將一個名為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”名稱空間的自定義名稱空間處理程序注冊,這是沿著這些方面的東西(這還不完整,只是為了說明配置的復雜性而顯示):
<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:
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{@Beanpublic RequestMappingHandlerMapping requestMappingHandlerMapping() {RequestMappingHandlerMapping handlerMapping = super.requestMappingHandlerMapping();handlerMapping.setUseSuffixPatternMatch(false);handlerMapping.setUseTrailingSlashMatch(false);return handlerMapping;}
}
并將此配置導入到配置xml的其余部分中(還有其他記錄的方法):
<bean class='mvcsample.spring.WebConfig'/><!--
<mvc:annotation-driven>
</mvc:annotation-driven>
-->
因此,@Configuration提供了一種更簡單的機制來配置Spring MVC中的組件,強烈建議從基于xml的配置遷移到Java配置,以簡化配置和管理定制。
參考: Spring MVC –來自all和雜類博客的JCG合作伙伴 Biju Kunjummen 自定義RequestMappingHandlerMapping 。
翻譯自: https://www.javacodegeeks.com/2013/01/spring-mvc-customizing-requestmappinghandlermapping.html