![](file:///C:/Users/bjliuzezhou/AppData/Local/YNote/data/qq473E3A14210D43A6846635FE8D495A0F/04595361c6954572abe052ee4d404f99/a7832a2d-3967-4538-9ef7-724840f94c90.png)
![](file:///C:/Users/bjliuzezhou/AppData/Local/YNote/data/qq473E3A14210D43A6846635FE8D495A0F/04595361c6954572abe052ee4d404f99/a7832a2d-3967-4538-9ef7-724840f94c90.png)
![](https://images2015.cnblogs.com/blog/751090/201603/751090-20160316114611099-1500696291.png)
![](file:///C:/Users/bjliuzezhou/AppData/Local/YNote/data/qq473E3A14210D43A6846635FE8D495A0F/b13125c856ac462dbfdfe7404872c70c/f1f50379-817c-4f58-b2a1-7fdbe15e0d07.png)
![](https://images2015.cnblogs.com/blog/751090/201603/751090-20160316114629740-2111997716.png)
![](https://images2015.cnblogs.com/blog/751090/201603/751090-20160316114648193-572538845.png)
![](file:///C:/Users/bjliuzezhou/AppData/Local/YNote/data/qq473E3A14210D43A6846635FE8D495A0F/a2d9063848d046aba8a4d89b0a932291/fc993672-6be7-4c75-b685-d4a1b14f5180.png)
<bean
>
<property name="defaultContentType" value="application/json"/>
<property name="mediaTypes">
<map>
<entry key="html" value="text/html;charset=UTF-8"/>
<entry key="json" value="application/json;charset=UTF-8"/>
<entry key="xml" value="application/xml;charset=UTF-8"/>
</map>
</property>
<property name="viewResolvers">
<list>
<bean
>
<property name="cache" value="false"/>
<property name="prefix" value=""/>
<property name="suffix" value=".ftl"/>
<property name="exposeSpringMacroHelpers" value="true"/>
<property name="exposeRequestAttributes" value="true"/>
<property name="exposeSessionAttributes" value="true"/>
<property name="allowSessionOverride" value="true"/>
<property name="contentType" value="text/html;charset=UTF-8"/>
</bean>
</list>
</property>
<property name="defaultViews">
<list>
<bean
>
<property name="objectMapper" ref="objectMapper"/>
<property name="contentType" value="application/json;charset=UTF-8"/>
<property name="modelKeys">
<set>
<value>msg</value>
<value>res</value>
<value>errmsg</value>
</set>
</property>
</bean>
<bean id="marshallingView"
>
<property name="marshaller" ref="xstreamMarshaller"></property>
<property name="modelKey" value="msg"></property>
<property name="contentType" value="application/xml"/>
</bean>
</list>
</property>
</bean>
![](https://images2015.cnblogs.com/blog/751090/201603/751090-20160316114707646-1651791921.png)
![](file:///C:/Users/bjliuzezhou/AppData/Local/YNote/data/qq473E3A14210D43A6846635FE8D495A0F/cdd871f616db4f229bfb504e2df65012/6fe1aa09-d885-4d73-940b-ac10e265ea97.png)
![](file:///C:/Users/bjliuzezhou/AppData/Local/YNote/data/qq473E3A14210D43A6846635FE8D495A0F/6bb7eb4bfccb48f68fc0826c40b18ed8/9057d5f4-30a3-42a8-acaf-c5ec90de61c0.png)
![](https://images2015.cnblogs.com/blog/751090/201603/751090-20160316114725412-216633103.png)
![](https://images2015.cnblogs.com/blog/751090/201603/751090-20160316114800349-311652608.png)
![](file:///C:/Users/bjliuzezhou/AppData/Local/YNote/data/qq473E3A14210D43A6846635FE8D495A0F/e01772a5339d4f7ca57bb2b374f1b3a1/86a1a05d-6aae-459e-9d0a-01f0edff919e.png)
2、获得转换器中支持Accept的media类型:*/*
3、转换器中支持的media类型是否兼容请求过来的Accept类型:*/*
4、根据请求等参数选择最佳的view
配置文件件配置了defaltView为MappingJackson2JsonView和MarshallingView,顺序匹配,为*时直接匹配上第一种,直播选择MappingJackson2JsonView解析。
![](file:///C:/Users/bjliuzezhou/AppData/Local/YNote/data/qq473E3A14210D43A6846635FE8D495A0F/ae04b41c015a4a91a6768c9b45259260/c9b21929-b15b-4db0-823e-9832af008bbd.png)
2、获得转换器中支持Accept的media类型:*/*
3、转换器中支持的media类型是否兼容请求过来的Accept类型:text/html, application/xhtml+xml, application/xml;q=0.9, */*;q=0.8
4、根据请求等参数选择最佳的view
配置文件件配置了defaltView为MappingJackson2JsonView和MarshallingView,顺序匹配,当匹配到application/xml时,直播返回使用MarshallingView解析。
以上步骤均是controller中没有加headers = { "Accept=application/json" }的情况,那为什么加了这段代码,firefox就可以运行了呢?
这时对应上面的步骤结果为:
2、获得转换器中支持Accept的media类型:application/json;q=0.8
3、转换器中支持的media类型是否兼容请求过来的Accept类型:application/json;q=0.8
4、根据请求等参数选择最佳的view:candidateViews类型为application/json,自然用MappingJackson2JsonView解析。
看上面的步骤大家已经明白了,加上Accept=application/json后获取的media类型就可以直接为application/json了,所以可以直接使用MappingJackson2JsonView解析,进而返回json数据格式。
再做了个实验,就是调换了一下defaultVeiws的配置顺序,把MarshallingView放在前面,在不加Accept=application/json,用chrome请求时,结果返回xml格式。
也就是说当accept是*/*时,他是顺序匹配的。
在spring mvc中,如果想返回的格式是指定的,也可以配置produces变量:
@RequestMapping(value = "/upload",produces="application/json;charset=UTF-8")
也可以达到同样的效果。
结论:
使用spring mvc时,如果返回的数据格式不正确,需要看一下请求头部的accept、controller层的header配置、以及配置文件中模板的渲染类型和配置顺序,通过这三个方式可以定位出原因。