以前使用springmvc 3.x的时候没怎么注意,也没有验证,在我们使用请求以html为后缀时,request对应的content-type 用的是html/text,导致无法返回正确的json,现在使用4.x的时候,出现了这样的问题,找了各种办法都没有解决,最后看到在获取MediaTypes的时候有几个策略,
,通过断点看到strategies默认是有两个ServletPathExtensionContentNegotiationStrategy、HeaderContentNegotiationStrategy,一个是根据请求路径获取,一个是根据请求头获取,如果我们的请求为.html,且先执行第一个策略,那么response对应的Content-Type也就固定了,这个时候不论这么设置都无效,现在解决方案,在spring xml中加上以下代码:
<mvc:annotation-driven content-negotiation-manager="contentNegotiationManager"/>
<bean id="contentNegotiationManager" class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
<property name="favorPathExtension" value="false" />
<property name="favorParameter" value="false" />
<property name="ignoreAcceptHeader" value="false" />
<property name="mediaTypes" >
<value>
atom=application/atom+xml
html=text/html
json=application/json
*=*/*
</value>
</property>
</bean>
在策略工厂取消根据请求后缀获取MediaTypes的方案即可