Long类型框架自动序列化成String失效问题排查
问题描述
微服务架构下进行业务模块开发时,发现每次涉及到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失效问题排查的更多相关文章
- java将int类型的变量转化成String类型的
第一种方法:String的valueOf方法,int i=5;String s=String.valueOf(i);第二种方法,直接在int后面加一个空的字符串,因为在java里面,默认任务int类型 ...
- webapi 实体作为参数,自动序列化成xml的问题
原文:http://bbs.csdn.net/topics/392038917 关注 Ray_Yang Ray_Yang 本版等级: #6 得分:0回复于: 2016-10-27 21:30:51 ...
- 基础类型转化成String 转
基础类型转化成String 在程序中你可能时常会需要将别的类型转化成String,有时候可能是一些基础类型的值.在拼接字符串的时候,如果你有两个或者多个基础类型的值需要放到前面,你需要显式的将第一个值 ...
- 利用自动类型转换存储string类型
类型转换是我们最常用的功能.就像上战场用的枪一样,敌人用的冲锋枪, 自己手里就一把步枪,打起仗来始终有点不爽. 因此,基本功能的完善很重要. 通常情况下我们需要String类型转其它的基础类型.这时我 ...
- java对象转化成String类型
在java项目的实际开发和应用中,常常需要用到将对象转为String这一基本功能.本文将对常用的转换方法进行一个总结.常用的方法有Object#toString(),(String)要转换的对象,St ...
- double类型转化成string
public static void main(String[] args) { double priceWithFreight = 1200.5698d; System.out.println(pr ...
- Linq之隐式类型、自动属性、初始化器、匿名类
目录 写在前面 系列文章 隐式类型 自动属性 初始化器 匿名类 总结 写在前面 上篇文章是本系列的小插曲,也是在项目中遇到,觉得有必要总结一下,就顺手写在了博客中,也希望能帮到一些朋友.本文将继续介绍 ...
- C#将对象序列化成JSON字符串
C#将对象序列化成JSON字符串 public string GetJsonString() { List<Product> products = new List<Product& ...
- 将Java对象序列化成JSON和XML格式
1.先定义一个Java对象Person: public class Person { String name; int age; int number; public String getName() ...
随机推荐
- GPU加速库AmgX
GPU加速库AmgX AmgX提供了一条简单的途径来加速NVIDIA GPU上的核心求解器技术.AmgX可以为模拟的计算密集型线性求解器部分提供高达10倍的加速度,特别适合于隐式非结构化方法. 它是一 ...
- 视频处理器为电池供电的设计提供4K视频编码
视频处理器为电池供电的设计提供4K视频编码 Video processor enables 4K video coding for battery-powered designs OmniVision ...
- Excel创建序列号1000个
一.输入1,并且选择 二.开始-填充 三.选择序列 四.选择列-等差序列-步张值输入1 终止值输入1000 点击确定 五.查看结果,选中这一列 六.快捷键 Ctrl+下键 则跳转到最下方,上键则是最上 ...
- CentOS 6.x 安装图形界面
CentOS 6.x 安装图形界面一.首先查看系统的运行级别以及是否安装了桌面环境1.使用命令 runlevel 查看当前系统运行级别[root@42 ~]# runlevelN 32.使用命令 yu ...
- 不使用synchronized和lock,如何实现一个线程安全的单例
单例,大家肯定都不陌生,这是Java中很重要的一个设计模式.稍微了解一点单例的朋友也都知道实现单例是要考虑并发问题的,一般情况下,我们都会使用synchronized来保证线程安全. 那么,如果有这样 ...
- 【题解】[LuoguP3503]「BZOJ2086」[POI2010] Blocks
题目描述 给出N个正整数a[1..N],再给出一个正整数k,现在可以进行如下操作:每次选择一个大于k的正整数a[i],将a[i]减去1,选择a[i-1]或a[i+1]中的一个加上1.经过一定次数的操作 ...
- 散列数据结构以及在HashMap中的应用
1. 为什么需要散列表? 对于线性表和链表而言,访问表中的元素,时间复杂度均为O(n).即便是通过树结构存储数据,时间复杂度也为O(logn).那么有没有一种方式可以将这个时间复杂度降为O(1)呢?当 ...
- 获取微信公众号的粉丝openid以及用openid获取unionID
第一步获取微信粉丝的openid https://api.weixin.qq.com/cgi-bin/user/get?access_token=access_token access_token这里 ...
- 微信订阅号中获取openid以及个人信息
采用的方式是利用另一个服务号获取用户信息. 其中有一个问题就是不关注这个服务号获取不了用户头像等信息.
- Golang编写Windows动态链接库(DLL)及C调用范例
一.准备. 1.GoLang在1.10版本之后开始支持编译windows动态链接库,可以打开命令行工具使用go version 查看自己的go版本. 2.你的电脑上需要gcc,如果没有的话[点击这里] ...