Spring 认为最后一个点后面的任何内容都是文件扩展名,例如 .json 或 .xml,并将其截断以检索您的参数。
所以如果你有/somepath/{variable}:
-
/somepath/param、/somepath/param.json、/somepath/param.xml 或 /somepath/param.anything 将产生一个值为 param 的参数
-
/somepath/param.value.json、/somepath/param.value.xml 或 /somepath/param.value.anything 将产生一个值为 param.value 的参数
如果您按照建议将映射更改为 /somepath/{variable:.+},则任何点(包括最后一个点)都将被视为参数的一部分:
-
/somepath/param 将产生一个值为 param 的参数
-
/somepath/param.json 将产生一个值为 param.json 的参数
-
/somepath/param.xml 将产生一个值为 param.xml 的参数
-
/somepath/param.anything 将产生一个值为 param.anything 的参数
-
/somepath/param.value.json 将产生一个值为 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/param、/somepath/param.json、/somepath/param.xml 或 /somepath/param.anything 将产生一个值为 param 的参数
-
/somepath/param.value.json、/somepath/param.value.xml 或 /somepath/param.value.anything 将产生一个值为 param.value 的参数
注意:与默认配置的区别仅在您具有somepath/something.{variable} 之类的映射时才可见。见Resthub project issue
如果你想保持扩展管理,从 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)(参见 https://jira.springsource.org/browse/SPR-7632)。
因此,您仍然必须覆盖所有 mvc:annotation-driven 配置。我开了一张 Spring 的票,要求定制 RequestMappingHandlerMapping :https://jira.springsource.org/browse/SPR-11253。如果您有兴趣,请投票。
在覆盖时,请谨慎考虑自定义执行管理覆盖。否则,您的所有自定义异常映射都将失败。您将不得不重用带有列表 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