微服務架構下進行業務模塊開發時,發現每次涉及到Long類型的字段時須要本身手動增長@JsonSerialize(using = ToStringSerializer.class)註解來序列化成字符串防止精度丟失。
前端
可是我以爲這樣處理不合理,我認爲太笨拙,確定有全局的方式。因此瞭解原理後嘗試經過修改框架源碼,經過objectMapper.registerModule(new LongModule())的方式來全局解決這個問題。
後端
修改完成以後本地測試沒問題,可是部署到開發服務器就出問題了。
因爲JS的Number類型只支持17位長度,後端返回Long類型是20位的,因此最後三位被自動轉成0。服務器
首先想到的就是哪裏寫錯了,我檢查了代碼,本地屢次測試都是能獲得指望值;架構
從新使用@JsonSerialize(using = ToStringSerializer.class)直接對字段進行序列化,部署以後問題獲得解決,由此我判斷是開發環境框架的jar包有問題致使我修改後的代碼沒生效;app
開發環境的jar包是從maven倉庫下載的,首先我就去maven下載了最新jar包,用jd-gui反編譯工具查看以後發現jar包沒問題,這就奇怪了。框架
由於咱們開發環境作過一次遷移工做,全部的應用和倉庫等等,宿主機IP都更新了,我懷疑當時安裝maven的同事沒有更新倉庫的配置文件,因此去開發服務器上檢查了maven的settings.xml配置,結果發現,是最新的配置。。。maven
會不會是打包的時候出問題了,打包過程當中下載的jar包版本不對。微服務
因此我從Jenkins工做目錄找到了對應應用的jar包,反編譯以後一看,果真代碼不對。工具
maven是正確的配置,爲何打包的時候會下載錯誤的jar包呢?測試
maven是會根據settings.xml文件找到正確的倉庫,這一步沒問題。查看本地倉庫中對於jar包的pom文件,發現pom文件是舊版的倉庫地址,由於作遷移的時候,nexus應用是最後作的遷移,因此應用遷移完成後發佈的時候,pom文件是從舊倉庫下載的。爲何新的maven配置文件更新後,沒有下載jar包最新的pom文件?由於咱們更新框架jar包沒有使用版本號,而且使用的是release倉庫,maven的默認策略是不會去更新相同版本號的release版本jar包。
刪除本地倉庫中框架jar包的pom文件,從新部署應用,發現自動下載了最新的pom文件,而後去掉@JsonSerialize(using = ToStringSerializer.class)註解上開發環境驗證Long類型精度丟失的問題。Long傳給前端沒有丟失精度,至此問題解決。 End