Feign接口JSON數據轉Date類型數據慢8小時問題

今天記一次錯誤排查及解決筆記

現象

最近在接口聯調中發現一個現象,前端傳入JSON格式數據,其中包含Long型時間戳,但是在調用Feign接口(有Date類型參數)的時候,發現Date類型參數總是比正確時間慢8小時

比如{"time":1515147840000},正確的Date類型時間應該是“2018-01-05 18:24:00”,但是經過Feign內部Encoder轉換後的Date卻是“2018-01-05 10:24:00”,比正確時間慢8小時

分析

我們處在東八區,看到8小時,直覺是轉換時時區設置錯誤的問題。Feign中數據的編/解碼使用的是SpringEncoder和SpringDecoder,查看源碼


SpringEncoder

具體負責轉換工作的是HttpMessageConverters,經過Debug,發現JSON數據默認使用的轉換器是MappingJackson2HttpMessageConverter

熟悉Jackson的朋友應該知道,轉換工作實際上是通過ObjectMapper來進行的,下面來說坑:如果不做設置,ObjectMapper中默認的TimeZone是UTC,會比我們東八區慢8小時,這就是原因所在


ObjectMapper

方案

(1)我們可以在@JsonFormat註解上通過設置timezone來處理,但是如果你有大量的接口,每個都這樣處理顯然不是一個好辦法


(2)怎樣全局處理?

首先需要自定義ObjectMapper,並設置時區(可通過Spring創建Bean的方式,請依據實際場景自行決定)


之後把上一步創建的ObjectMapper設置到MappingJackson2HttpMessageConverter中


看似Feign的問題,根源在於Jackson,使用Jackson時要注意這點

Done

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章