天天看點

Fastjson 作為Spring Boot 預設json解析器注意點

Fastjson 不多說了,有喜歡的有讨厭的,本項目選址了它,且将Fastjson作為Spring Boot 視圖層的預設Json解析器。

Spring boot 配置預設json解析器如下:

某天出現的問題:

線上報登入查詢出現問題,後來查詢問題原因發現 Long類型字段傳遞到前端精度丢失。

但! 我們已經配置了Fastjson裡面的 Long類型的政策啊?

後來又仔細檢視,發現傳回的結果資訊雖然是JSON格式的,但是

response 設定Header裡面的 content-type 值變成了 text/html;charset=UTF-8 導緻最後非真正的JSON體傳回給浏覽器JS解析。

進過仔細debug 源碼,理清了思路:

Spring MVC 通過 MediaType 來決定json的解析最終傳回文本類型是哪一種

前端通過 Header 裡面設定 Accept 來告知 Spring MVC 最終期望的文本類型

如果前端 Header 沒有設定 Accept 的值,則預設為 * / *

如果 Accept 為 */ * 則最終會選取 FastJsonHttpMessageConverter 中supportedMediaTypes 集合中的第一個作為 最終期望的文本類型

問題原因找到了:

當初不小心把本來在 第一個的 supportedMediaTypes.add(MediaType.APPLICATION_JSON); 挪移到了下面,且前端從來沒有在header裡面設定Accept 的值,是以Spring MVC 最後選擇了 supportedMediaTypes.add(MediaType.TEXT_HTML); 作為第一個解析。

還是要對Spring MVC 的源碼進行深入解讀才行

Fastjson 作為Spring Boot 預設json解析器注意點

Fastjson 作為Spring Boot 預設json解析器注意點

SpringMVC 提供了 HttpMessageConverter 接口,使用者可以實作接口來轉換http請求和響應,比如我們實作請求的序列化和響應的反序列化。

上面的 FastJsonHttpMessageConverter 繼承了HttpMessageConverter接口。

​​https://www.jianshu.com/p/0aaeb4144489​​

Fastjson 作為Spring Boot 預設json解析器注意點

繼續閱讀