博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
由JSON序列化失败引起的对序列化过程配置的思考
阅读量:6238 次
发布时间:2019-06-22

本文共 3690 字,大约阅读时间需要 12 分钟。

问题描述

本次遇到问题时所使用的框架是Spring Boot,处理完请求之后,返回数据之前,在POJO转化成JSON时,有些属性违背输出规则或者有些属性循环引用会造成无法输出。

报错信息: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); nested exception is com.fasterxml.jackson.databind.JsonMappingException: No serializer found for class java.lang.Object and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS)

部分代码片段:

@Override    public ReviewReportDto getReviewReport(String requestId) {        ReviewReportDto resDto = new ReviewReportDto();        ...        ...        //Object对象实例导致序列化错误        resDto.setOffLineDto(new Object());        return resDto;    }

当然解决方式有很多种,在最初版本的代码开发过程中,由于部分业务的缺失,暂时把空位补上new Object(),而其表示的其实就是null(空对象),导致序列化时报错。


解决方法

  • 第一种方法:
    直接把new Object()替换为null,即可解决序列化错误问题。
  • 第二种方法
    通过设置,使Jackson遇到空对象不抛异常。
@Bean("objectMapper")    public ObjectMapper myMapper() {        return new ObjectMapper().disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);    }
  • 第三种方法(spring mvc项目)
    通过xml配置自定义类来覆盖默认配置
//自定义类    public class MyMapper extends ObjectMapper {        public MyMapper() {            configure(SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS, false);        }    }
...
...

序列化过程配置的规整

此处贴出SerializationFeature的源码,以及对部分常用配置方式的总结:

package com.fasterxml.jackson.databind;import com.fasterxml.jackson.databind.cfg.ConfigFeature;public enum SerializationFeature implements ConfigFeature {    //是否环绕根元素,默认false,如果为true,则默认以类名作为根元素。根元素名称也可以通过@JsonRootName来自定义。    WRAP_ROOT_VALUE(false),    //是否缩放排列输出,默认false,有些场合为了便于排版阅读则需要对输出做缩放排列    INDENT_OUTPUT(false),    //遇到空对象则失败    FAIL_ON_EMPTY_BEANS(true),    //自我引用则失败    FAIL_ON_SELF_REFERENCES(true),    //com.fasterxml.jackson.annotation.JsonUnwrapped包下相关联的类将会抛出异常    WRAP_EXCEPTIONS(true),    FAIL_ON_UNWRAPPED_TYPE_IDENTIFIERS(true),    CLOSE_CLOSEABLE(false),    FLUSH_AFTER_WRITE_VALUE(true),    WRITE_DATES_AS_TIMESTAMPS(true),    //序列化日期时以timestamps输出,默认true    WRITE_DATE_KEYS_AS_TIMESTAMPS(false),    WRITE_DATES_WITH_ZONE_ID(false),    WRITE_DURATIONS_AS_TIMESTAMPS(true),    //序列化char[]时以json数组输出,默认false    WRITE_CHAR_ARRAYS_AS_JSON_ARRAYS(false),    //序列化枚举是以toString()来输出,默认false,即默认以name()来输出    WRITE_ENUMS_USING_TO_STRING(false),    //序列化枚举是以ordinal()来输出,默认false    WRITE_ENUMS_USING_INDEX(false),    WRITE_NULL_MAP_VALUES(true),    /** @deprecated */    @Deprecated    WRITE_EMPTY_JSON_ARRAYS(true),    //序列化单元素数组时不以数组来输出,默认false    WRITE_SINGLE_ELEM_ARRAYS_UNWRAPPED(false),    /** @deprecated */    @Deprecated    //序列化BigDecimal时之间输出原始数字还是科学计数,默认false,即是否以toPlainString()科学计数方式来输出    WRITE_BIGDECIMAL_AS_PLAIN(false),    WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS(true),    //序列化Map时对key进行排序操作,默认false    ORDER_MAP_ENTRIES_BY_KEYS(false),    EAGER_SERIALIZER_FETCH(true),    USE_EQUALITY_FOR_OBJECT_ID(false);    private final boolean _defaultState;    private final int _mask;    private SerializationFeature(boolean defaultState) {        this._defaultState = defaultState;        this._mask = 1 << this.ordinal();    }    public boolean enabledByDefault() {        return this._defaultState;    }    public int getMask() {        return this._mask;    }    public boolean enabledIn(int flags) {        return (flags & this._mask) != 0;    }}

By the way:引用请标明出处。如有错误,请批评指正。

转载地址:http://czkia.baihongyu.com/

你可能感兴趣的文章
Yii用ajax实现无刷新检索更新CListView数据
查看>>
JDBC的事务
查看>>
App 卸载记录
查看>>
JavaScript变量和作用域
查看>>
开源SIP服务器加密软件NethidPro升级
查看>>
Apache Pulsar中的地域复制,第1篇:概念和功能
查看>>
python pip install 出现 OSError: [Errno 1] Operation not permitted
查看>>
从源码分析scrollTo、scrollBy、Scroller方法的区别和作用
查看>>
ObjectOutputStream和ObjectInputStream
查看>>
南京大学周志华教授当选欧洲科学院外籍院士
查看>>
马士兵教学语录
查看>>
计算机网络与Internet应用
查看>>
oracle在线迁移同步数据,数据库报错
查看>>
linux性能剖析工具
查看>>
flutter中的异步
查看>>
计算机高手也不能编出俄罗斯方块——计算机达人成长之路(16)
查看>>
error LNK2001: 无法解析的外部符号 __CrtDbgReport
查看>>
【多线程】的简单理解&进程 and【你的电脑是几核的?】
查看>>
# 2017-2018-1 20155224 《信息安全系统设计基础》第七周学习总结
查看>>
scikit-learn预处理实例之一:使用FunctionTransformer选择列
查看>>