問題描述
微服務架構下進行業務模組開發時,發現每次涉及到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