框架BigDecimal序列化策略修复(Fastjson源码解析)

目录

前言

自定义序列化策略是如何实现的

我的排查过程

解决方案

小结


前言

我们公司的框架对接口返回的java对象转换为字符串的序列化策略上进行了定制。如:当String类型属性值为null时,会转换为空字符串返回、当List类型为nul时返回长度为0的空数组、当Boolean类型为null时返回false、对Bigdecimal类型的属性值,默认保留2位小数点

关于最后一点,当业务需要指定其他精度时,可以在成员属性上添加@JSONField注解来指定保留小数位数。

    /**
     * 保留小数点后6位
     */
    @ApiModelProperty("经度")
    @JSONField(format = "#0.000000")
    private BigDecimal longitude;

但是经实验后发现,该注解在微服务A下生效,在微服务B下无效,即 始终返回2位小数。因此尝试定位原因并修复。

自定义序列化策略是如何实现的

注:以下代码、图片均为个人工程的模拟重现,去除了一些无关代码以便于理解。

根据框架配置可以发现在WebMvcConfiguration.java中重写了 configureMessageConverters(List<HttpMessageConverter<?>> converters) 方法,并引入了 CustomBigDecimalCodec.java 对BigDecimal属性的序列化策略进行定制。

CustomBigDecimalCodec.java 是一个自定义编解码器,在参数传入、返回时进行 “字符串和BigDecimal属性”之间的转换策略。

它继承了fastjson(version: 1.2.70)的BigDecimalCodec.java并重写了write(JSONSerializer serializer, Object object

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值