Spring认为最后一个点后面的任何内容都是文件扩展名,例如.json
或.xml
,并截断它以检索您的参数。
所以,如果你有/{blahName}
:
/param
,/param.json
,/param.xml
或/param.anything
将导致PARAM值为param
/param.value.json
,/param.value.xml
或/param.value.anything
将导致PARAM值为param.value
如果您将映射更改为/{blahName:.+}
的建议,任何点,包括最后一个,将被视为您参数的一部分:
/param
将导致与价值设置了一个param param
/param.json
将导致PARAM值为param.json
/param.xml
将产生具有值的PARAM param.xml
/param.anything
将导致与PARAM值param.anything
/param.value.json
将导致与价值param.value.json
- 设置了一个param ...
如果你不在乎扩展的认可,你可以通过重写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>
所以,再次,如果你有/{blahName}
:
/param
,/param.json
,/param.xml
或/param.anything
将导致PARAM值为param
/param.value.json
,/param.value.xml
或/param.value.anything
会导致与价值设置了一个param param.value
注:从默认的配置不同的是仅可见,如果你有一个映射如/something.{blahName}
。见Resthub project issue。
如果您想保留扩展管理,自Spring 3.2以来,您还可以设置RequestMappingHandlerMapping bean的useRegisteredSuffixPatternMatch属性,以保持后缀模式识别已激活但仅限于已注册的扩展名。
在这里,你只定义了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:注解驱动现在接受contentNegotiation选项提供自定义的bean,但RequestMappingHandlerMapping的财产已被更改为true(默认假)(参见https://jira.springsource.org/browse/SPR-7632)。
因此,您仍然必须覆盖所有mvc:注释驱动的配置。我打开了Spring的门票以请求自定义的RequestMappingHandlerMapping:https://jira.springsource.org/browse/SPR-11253。请投票,如果你有兴趣。
重写时,要小心也考虑自定义执行管理覆盖。否则,您所有的自定义异常映射都将失败。你将有一个列表豆重用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
看来这已经在Spring解决了3.2-M2:参见[允许内容协商有效的文件扩展名的路径(https://jira.springsource.org/browse/SPR-7632)和[其文件](http://static.springsource.org/spring/docs/3.2.0.M2/reference/htmlsingle) /#MVC-配置内容协商)。 – Arjan 2012-10-17 19:59:40