天天看點

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

目錄

  • 問題描述
    • 猜想
      • 1. 寫錯了
      • 2. 重新使用
    • 驗證猜想
      • 1.驗證猜想
      • 2.繼續猜想
      • 3.再次猜想
      • 4.再次驗證
      • 5.疑惑
      • 6.找到原因,解決疑惑
      • 7.解決

問題描述

微服務架構下進行業務子產品開發時,發現每次涉及到Long類型的字段時需要自己手動增加@JsonSerialize(using = ToStringSerializer.class)注解來序列化成字元串防止精度丢失。

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

但是我覺得這樣處理不合理,我認為太笨拙,肯定有全局的方式。是以了解原理後嘗試通過修改架構源碼,通過objectMapper.registerModule(new LongModule())的方式來全局解決這個問題。

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

修改完成之後本地測試沒問題,但是部署到開發伺服器就出問題了。

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

由于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傳給前端沒有丢失精度,至此問題解決。

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

End