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

Tags: