Spring认为最后一个点后面的任何东西都是文件扩展名,例如.jsonor .xml,并对其进行构造以检索参数。
如果你有/somepath/{variable}:
/ somepath /参数/ somepath /参数。/somepath/param.xml或/somepath/param. Json。任何参数都会产生一个值为param的参数
/ somepath / param.value。/somepath/param.value.xml或/somepath/param.value。任何参数都会产生一个值为param.value的参数
如果您将映射更改为/somepath/{variable:。正如建议的那样,任何点,包括最后一个点都将被视为参数的一部分:
/somepath/param将得到一个值为param的参数
/ somepath /参数。Json将产生一个param值为param. Json
/somepath/param.xml将产生一个值为param.xml的参数
/ somepath /参数。任何参数都会产生值为param. Anything的参数
/ somepath / param.value。Json将产生一个param值为param.value. Json
...
如果你不关心扩展识别,你可以通过重写mvc:annotation-driven automagic来禁用它:
<bean id="handlerMapping"
class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping">
<property name="contentNegotiationManager" ref="contentNegotiationManager"/>
<property name="useSuffixPatternMatch" value="false"/>
</bean>
同样,如果你有/somepath/{variable}:
/ somepath /参数/ somepath /参数。/somepath/param.xml或/somepath/param. Json。任何参数都会产生一个值为param的参数
/ somepath / param.value。/somepath/param.value.xml或/somepath/param.value。任何参数都会产生一个值为param.value的参数
注意:只有当你有一个类似somepath/something.{variable}的映射时,与默认配置的区别才可见。参见Resthub项目问题
如果你想保持扩展管理,从Spring 3.2开始,你还可以设置RequestMappingHandlerMapping bean的useRegisteredSuffixPatternMatch属性,以保持suffixPattern识别激活,但仅限于注册的扩展。
这里只定义了json和xml扩展名:
<bean id="handlerMapping"
class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping">
<property name="contentNegotiationManager" ref="contentNegotiationManager"/>
<property name="useRegisteredSuffixPatternMatch" value="true"/>
</bean>
<bean id="contentNegotiationManager" class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
<property name="favorPathExtension" value="false"/>
<property name="favorParameter" value="true"/>
<property name="mediaTypes">
<value>
json=application/json
xml=application/xml
</value>
</property>
</bean>
注意,mvc:annotation-driven现在接受contentNegotiation选项来提供自定义bean,但是RequestMappingHandlerMapping的属性必须更改为true(默认为false) (cf. https://jira.springsource.org/browse/SPR-7632)。
出于这个原因,您仍然必须重写所有mvc:注解驱动的配置。我打开了一个Spring请求自定义RequestMappingHandlerMapping的票据:https://jira.springsource.org/browse/SPR-11253。如果你感兴趣,请投票。
在重写时,也要注意考虑自定义执行管理重写。否则,所有自定义Exception映射都将失败。你必须使用列表bean重用messageCoverters:
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean" />
<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean" />
<util:list id="messageConverters">
<bean class="your.custom.message.converter.IfAny"></bean>
<bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter"></bean>
<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>
<bean class="org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter"></bean>
<bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"></bean>
</util:list>
<bean name="exceptionHandlerExceptionResolver"
class="org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver">
<property name="order" value="0"/>
<property name="messageConverters" ref="messageConverters"/>
</bean>
<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 name="validator" ref="validator" />
</bean>
</property>
<property name="messageConverters" ref="messageConverters"/>
</bean>
<bean id="handlerMapping"
class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping">
</bean>
我在我参与的开源项目Resthub中实现了一组关于这些主题的测试:参见https://github.com/resthub/resthub-spring-stack/pull/219/files和https://github.com/resthub/resthub-spring-stack/issues/217