1.如果controlloer上用@ResponseBody注解,則用<mvc:message-converter>里面配置的json解析器進行解析
<mvc:annotation-driven>
<mvc:message-converters register-defaults="true">
<bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
<property name="supportedMediaTypes" value="text/html;charset=UTF-8"/>
<property name="features">
<array>
<value>WriteMapNullValue</value>
<value>WriteNullStringAsEmpty</value>
</array>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
2.如果希望自定義View進行解析,則不能在controller上加 @ResponseBody注解,理由看一.
自定義View進行json和jsonp格式的自動判斷並返回相應的json格式
public class JsonView implements View {
private static final String CONTENT_TYPE = "application/json";
private static final String RESULT = "result";
@Override
public String getContentType() {
return CONTENT_TYPE;
}
@Override
public void render(Map<String, ?> model, HttpServletRequest request, HttpServletResponse response) throws Exception {
if(model != null && model.containsKey(RESULT)){
Result result = (Result)model.get(RESULT);
if(result != null){
ResultUtils.render(result, request, response);
}
}
}
}
配置ContentNegotiatingViewResolver,進行json解析器選擇
<bean id="contentNegotiationManager"
class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
<property name="favorPathExtension" value="true" />
<property name="favorParameter" value="true" />
<property name="ignoreAcceptHeader" value="true" />
<property name="ignoreUnknownPathExtensions" value="false" />
<property name="mediaTypes">
<map>
<entry key="json" value="application/json"></entry>
<entry key="xml" value="application/xml"></entry>
<entry key="html" value="text/html"></entry>
</map>
</property>
</bean>
<bean id="contentNegotiatingViewResolver"
class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
<property name="order" value="0" />
<property name="contentNegotiationManager" ref="contentNegotiationManager"/>
<property name="useNotAcceptableStatusCode" value="false"/>
<!-- 設置默認視圖 -->
<property name="defaultViews">
<list>
<bean class="com.tools.util.JsonView"></bean>
<bean class="com.tools.util.JsonpView"></bean>
</list>
</property>
<!-- 設置視圖解析器 -->
<property name="viewResolvers">
<list>
<ref bean="viewResolver"/>
</list>
</property>
</bean>
order:如果存在多個viewResolver則order值小的被使用,如果沒有合適的viewResolver則會使用另外的;
favorPathExtension:是否支持擴展名,默認為true(支持),擴展名指的xxx.json、xxx.xml等形式
favorParameter:是否啟用參數支持,默認為true(支持),即xxx?format=json、xxx?format=xml等形式,這里的參數名默認為format,可以通過配置改變。
ignoreAcceptHeader:是否忽略accept header,默認是false(不忽略),即請求時指定的contentType:application/json等,由於我這里要使用擴展名的形式返回,所以把另外兩項都關閉了,可視不同情況,使用不同設置;
mediaTypes:配置擴展名到mimeType的映射,這里配置了json和xml的映射;
defaultViews:配置視圖,這里配置了json和xml的視圖,json使用的jackson;
這樣就可以實現不同的文件擴展名用不同的View解析器進行解析
