Long类型框架⾃动序列化成String失效问题排查
⽬录
问题描述
微服务架构下进⾏业务模块开发时,发现每次涉及到Long类型的字段时需要⾃⼰⼿动增加@JsonSerialize(using = ToStringSerializer.class)注解来序列化成字符串防⽌精度丢失。
但是我觉得这样处理不合理,我认为太笨拙,肯定有全局的⽅式。所以了解原理后尝试通过修改框架源码,通过isterModule(new LongModule())的⽅式来全局解决这个问题。
修改完成之后本地测试没问题,但是部署到开发服务器就出问题了。
由于JS的Number类型只⽀持17位长度,后端返回Long类型是20位的,所以最后三位被⾃动转成0。
猜想
1. 写错了
⾸先想到的就是哪⾥写错了,我检查了代码,本地多次测试都是能得到期望值;
2. 重新使⽤
重新使⽤@JsonSerialize(using = ToStringSerializer.class)直接对字段进⾏序列化,部署之后问题得到解决,由此我判断是开发环境框架的jar包有问题导致我修改后的代码没⽣效;
验证猜想
1.验证猜想
开发环境的jar包是从maven仓库下载的,⾸先我就去maven下载了最新jar包,⽤jd-gui反编译⼯具查看之后发现jar包没问题,这就奇怪了。
2.继续猜想
因为我们开发环境做过⼀次迁移⼯作,所有的应⽤和仓库等等,宿主机IP都更新了,我怀疑当时安装maven的同事没有更新仓库的配置⽂件,所以去开发服务器上检查了maven的l配置,结果发现,是最新的配置。。。
3.再次猜想
maven打包本地jar包会不会是打包的时候出问题了,打包过程中下载的jar包版本不对。
4.再次验证
所以我从Jenkins⼯作⽬录到了对应应⽤的jar包,反编译之后⼀看,果然代码不对。
5.疑惑
maven是正确的配置,为什么打包的时候会下载错误的jar包呢?
6.到原因,解决疑惑
maven是会根据l⽂件到正确的仓库,这⼀步没问题。查看本地仓库中对于jar包的pom⽂件,发现pom⽂件是旧版的仓库地址,因为做迁移的时候,nexus应⽤是最后做的迁移,所以应⽤迁移完成后发布的时候,pom⽂件是从旧仓库下载的。为什么新的maven配置⽂件更新后,没有下载jar包最新的pom⽂件?因为我们更新框架jar包没有使⽤版本号,并且使⽤的是release仓库,maven的默认策略是不会去更新相同版本号的release版本jar包。7.解决
删除本地仓库中框架jar包的pom⽂件,重新部署应⽤,发现⾃动下载了最新的pom⽂件,然后去掉@JsonSerialize(using = ToStringSerializer.class)注解上开发环境验证Long类型精度丢失的问题。Long传给前端没有丢失精度,⾄此问题解决。
End

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。