Long類型框架自動序列化成String失效問題排查

問題描述

微服務架構下進行業務模塊開發時,發現每次涉及到Long類型的字段時須要本身手動增長@JsonSerialize(using = ToStringSerializer.class)註解來序列化成字符串防止精度丟失。
在這裏插入圖片描述前端

可是我以爲這樣處理不合理,我認爲太笨拙,確定有全局的方式。因此瞭解原理後嘗試經過修改框架源碼,經過objectMapper.registerModule(new LongModule())的方式來全局解決這個問題。
在這裏插入圖片描述
在這裏插入圖片描述後端

修改完成以後本地測試沒問題,可是部署到開發服務器就出問題了。
在這裏插入圖片描述
因爲JS的Number類型只支持17位長度,後端返回Long類型是20位的,因此最後三位被自動轉成0。服務器

猜測

1. 寫錯了

首先想到的就是哪裏寫錯了,我檢查了代碼,本地屢次測試都是能獲得指望值;架構

2. 從新使用

從新使用@JsonSerialize(using = ToStringSerializer.class)直接對字段進行序列化,部署以後問題獲得解決,由此我判斷是開發環境框架的jar包有問題致使我修改後的代碼沒生效;app

驗證猜測

1.驗證猜測

開發環境的jar包是從maven倉庫下載的,首先我就去maven下載了最新jar包,用jd-gui反編譯工具查看以後發現jar包沒問題,這就奇怪了。框架

2.繼續猜測

由於咱們開發環境作過一次遷移工做,全部的應用和倉庫等等,宿主機IP都更新了,我懷疑當時安裝maven的同事沒有更新倉庫的配置文件,因此去開發服務器上檢查了maven的settings.xml配置,結果發現,是最新的配置。。。maven

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

相關文章
相關標籤/搜索