Spring MVC 解决 Could not write JSON: No serializer found for class java.lang.Object

来源:互联网 发布:windows商城 编辑:程序博客网 时间:2024/05/15 20:02

Spring MVC 解决 Could not write JSON: No serializer found for class java.lang.Object

资料参考:http://stackoverflow.com/questions/28862483/spring-and-jackson-how-to-disable-fail-on-empty-beans-through-responsebody

出问题前的配置

<mvc:annotation-driven>    <mvc:message-converters>        <bean class="org.springframework.http.converter.StringHttpMessageConverter">            <property name="supportedMediaTypes">                <list>                    <value>text/plain;charset=UTF-8</value>                    <value>text/html;charset=UTF-8</value>                </list>            </property>        </bean>        <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">            <property name="supportedMediaTypes">                <list>                    <value>application/json; charset=UTF-8</value>                    <value>application/x-www-form-urlencoded; charset=UTF-8</value>                </list>            </property>            <property name="objectMapper">                <bean class="com.fasterxml.jackson.databind.ObjectMapper">                    <property name="serializationInclusion">                        <value type="com.fasterxml.jackson.annotation.JsonInclude.Include">NON_NULL</value>                    </property>                </bean>            </property>        </bean>    </mvc:message-converters></mvc:annotation-driven>

问题描述

SpringMVC的注解@ResponseBody在以下情况使用时:

@ResponseBody@RequestMapping("/your_url/act.do")public Map<String, Object> yourMethod(){    // do your work...    Map<String, Object> resultMap = new HashMap<>();    resultMap.put("code", 0);    resultMap.put("data", new Object());// 序列化 new Obejct()}

会报如下错误

 DefaultHandlerExceptionResolver:134 : Resolving exception from handler []: org.springframework.http.converter.HttpMessageNotWritableException:  Could not write JSON: No serializer found for class java.lang.Object and no properties discovered to create BeanSerializer  (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) ) ;

意思是没有找到可用于Object的序列化器,也没有找到属性去创建BeanSerializer。
后面的接着提示了解决方法:(to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS)

解决方案

为SpringMVC里默认序列化使用的 com.fasterxml.jackson.databind.ObjectMapper 设置其属性 SerializationFeature.FAIL_ON_EMPTY_BEANS 为false。
貌似没办法直接在XML配置里设置。只能自定义 com.fasterxml.jackson.databind.ObjectMapper 类进行设置,然后再配置xml。过程如下:

// 继承 ObjectMapper 类public class CustomMapper extends ObjectMapper{     public CustomMapper() {        this.setSerializationInclusion(JsonInclude.Include.NON_NULL);        // 设置 SerializationFeature.FAIL_ON_EMPTY_BEANS 为 false        this.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);    }}
<!-- Spring MVC 配置 --><mvc:annotation-driven>    <mvc:message-converters>        <bean class="org.springframework.http.converter.StringHttpMessageConverter">            <property name="supportedMediaTypes">                <list>                    <value>text/plain;charset=UTF-8</value>                    <value>text/html;charset=UTF-8</value>                </list>            </property>        </bean>        <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">            <property name="supportedMediaTypes">                <list>                    <value>application/json; charset=UTF-8</value>                    <value>application/x-www-form-urlencoded; charset=UTF-8</value>                </list>            </property>            <!-- 配置 objectMapper 为我们自定义扩展后的 CustomMapper -->            <property name="objectMapper">                <bean class="com.king.framework.jackson.CustomMapper">                </bean>            </property>        </bean>    </mvc:message-converters></mvc:annotation-driven>

关于属性 SerializationFeature.FAIL_ON_EMPTY_BEANS 的更多内容不在本文探讨范围内,详见 Jackson 文档及源码。

1 0