问题描述

微服务架构下进行业务模块开发时,发现每次涉及到Long类型的字段时需要自己手动增加@JsonSerialize(using = ToStringSerializer.class)注解来序列化成字符串防止精度丢失。

但是我觉得这样处理不合理,我认为太笨拙,肯定有全局的方式。所以了解原理后尝试通过修改框架源码,通过objectMapper.registerModule(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的settings.xml配置,结果发现,是最新的配置。。。

3.再次猜想

会不会是打包的时候出问题了,打包过程中下载的jar包版本不对。

4.再次验证

所以我从Jenkins工作目录找到了对应应用的jar包,反编译之后一看,果然代码不对。

5.疑惑

maven是正确的配置,为什么打包的时候会下载错误的jar包呢?

6.找到原因,解决疑惑

maven是会根据settings.xml文件找到正确的仓库,这一步没问题。查看本地仓库中对于jar包的pom文件,发现pom文件是旧版的仓库地址,因为做迁移的时候,nexus应用是最后做的迁移,所以应用迁移完成后发布的时候,pom文件是从旧仓库下载的。为什么新的maven配置文件更新后,没有下载jar包最新的pom文件?因为我们更新框架jar包没有使用版本号,并且使用的是release仓库,maven的默认策略是不会去更新相同版本号的release版本jar包。

7.解决

删除本地仓库中框架jar包的pom文件,重新部署应用,发现自动下载了最新的pom文件,然后去掉@JsonSerialize(using = ToStringSerializer.class)注解上开发环境验证Long类型精度丢失的问题。Long传给前端没有丢失精度,至此问题解决。

End

Long类型框架自动序列化成String失效问题排查的更多相关文章

  1. java将int类型的变量转化成String类型的

    第一种方法:String的valueOf方法,int i=5;String s=String.valueOf(i);第二种方法,直接在int后面加一个空的字符串,因为在java里面,默认任务int类型 ...

  2. webapi 实体作为参数,自动序列化成xml的问题

    原文:http://bbs.csdn.net/topics/392038917 关注 Ray_Yang Ray_Yang 本版等级:   #6 得分:0回复于: 2016-10-27 21:30:51 ...

  3. 基础类型转化成String 转

    基础类型转化成String 在程序中你可能时常会需要将别的类型转化成String,有时候可能是一些基础类型的值.在拼接字符串的时候,如果你有两个或者多个基础类型的值需要放到前面,你需要显式的将第一个值 ...

  4. 利用自动类型转换存储string类型

    类型转换是我们最常用的功能.就像上战场用的枪一样,敌人用的冲锋枪, 自己手里就一把步枪,打起仗来始终有点不爽. 因此,基本功能的完善很重要. 通常情况下我们需要String类型转其它的基础类型.这时我 ...

  5. java对象转化成String类型

    在java项目的实际开发和应用中,常常需要用到将对象转为String这一基本功能.本文将对常用的转换方法进行一个总结.常用的方法有Object#toString(),(String)要转换的对象,St ...

  6. double类型转化成string

    public static void main(String[] args) { double priceWithFreight = 1200.5698d; System.out.println(pr ...

  7. Linq之隐式类型、自动属性、初始化器、匿名类

    目录 写在前面 系列文章 隐式类型 自动属性 初始化器 匿名类 总结 写在前面 上篇文章是本系列的小插曲,也是在项目中遇到,觉得有必要总结一下,就顺手写在了博客中,也希望能帮到一些朋友.本文将继续介绍 ...

  8. C#将对象序列化成JSON字符串

    C#将对象序列化成JSON字符串 public string GetJsonString() { List<Product> products = new List<Product& ...

  9. 将Java对象序列化成JSON和XML格式

    1.先定义一个Java对象Person: public class Person { String name; int age; int number; public String getName() ...

随机推荐

  1. 3D-LaneNet:端到端三维多车道检测ICCV2019

    3D-LaneNet:端到端三维多车道检测ICCV2019 3D-LaneNet: End-to-End 3D Multiple Lane Detection 论文链接: http://openacc ...

  2. 包及权限配置&java存储机理绘制

    包及权限配置 包的声明和导入 //声明 package aa.bb.cc; public class A{;} class B{;} //即在java输出目录aa.bb.cc中放入编译后的A.clas ...

  3. git介绍及使用

    一.架构 版本库(仓库):工作区中有一个隐藏目录.git,这个目录不属于工作区,而是git的版本库,是git管理的所有内容. 暂存区:版本库中包含一个临时区域,保存下一步要提交的文件. 分支:版本库中 ...

  4. Hive窗口函数保姆级教程

    在SQL中有一类函数叫做聚合函数,例如sum().avg().max()等等,这类函数可以将多行数据按照规则聚集为一行,一般来讲聚集后的行数是要少于聚集前的行数的.但是有时我们想要既显示聚集前的数据, ...

  5. python+requests接口用例

    本实例通过请求接口登录系统,获取了配置项的ID,并最终实现了对配置项的默认值进行修改 使用到的接口请求方法有:get(查询) ,post(新增),put(修改) 遇到的阻碍点见下面具体代码处的详解 编 ...

  6. WordPress安装篇(3):用宝塔面板在Linux上安装WordPress

    前面的文章已经介绍了如何在Windows环境安装WordPress,这篇文章来介绍在Linux环境怎样快速安装WordPress.大家都知道,Linux系统相对于Windows系统而言占用资源更少.更 ...

  7. 【NX二次开发】Block UI 截面构建器

    属性说明 属性   类型   描述   常规           BlockID    String    控件ID    Enable    Logical    是否可操作    Group    ...

  8. 【NX二次开发】根据部件名返回部件tag,UF_PART_ask_part_tag

    注意UF_PART_ask_part_tag的参数输入带扩展名的部件名或者不带扩展名的部件名,不允许输入全路径名,否则会出错,例如下面这例子.部件在C盘"C:\\temp\\B01.prt ...

  9. 性能工具之Jmeter压测Hprose RPC服务

    概述 Hprose(High Performance Remote Object Service Engine),国人开发的一个远程方法调用的开源框架.它是一个先进的轻量级的跨语言跨平台面向对象的高性 ...

  10. App免责声明

    一切移动客户端用户在下载并浏览xxxAPP软件时均被视为已经仔细阅读本条款并完全同意.凡以任何方式使用本APP,或直接.间接使用本APP资料者,均被视为自愿接受本网页相关声明和用户服务协议的约束. x ...