已經好久沒寫過springboot的相關博客了,前面一段時間一直在寫clojure,致使基本不多關注springboot的一些狀況,恰好最近在寫一些小玩意,期間,遇到一些問題,而後整理了一下,避免其餘小夥伴跟我遇到同樣的問題,而浪費時間前端
先介紹一下開發環境:java
問題介紹,在springboot跟spring返回json的數據中,若是long類型超過18位長度,會致使前端js接收參數丟失精準度問題web
------------------------------------分割線-------------------------------spring
出現以上問題,咱們有2個解決方案.json
- 咱們將每一個Long類型都手動轉換成字符串
- 咱們將返回給前端數據以前,序列化json的時候在指定將Long或者其餘的轉換成咱們指定的類型
顯然,第一種很繁瑣.全部地方都要處理,第二種更合理,在序列化的時候作統一的處理,將類型轉換了,咱們就來弄第二種吧.springboot
------------------------------------show code-------------------------------mvc
首先,咱們都知道,springmvc返回給前端的消息轉換接口是 app
HttpMessageConverter
,因此,咱們須要替換掉以接口的實現,變成咱們自定義的實現,或者在原來規則下,添加新的規則.ide
springboot(1.5.2)中,web配置,咱們需繼承一個抽象類函數
WebMvcConfigurerAdapter,而後咱們選擇重寫
configureMessageConverters(List<HttpMessageConverter<?>> converters)函數,該函數接收一個集合的Http消息轉換接口,
而後,咱們添加一個jackson序列化httpresponse數據的實現
具體實現以下
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { MappingJackson2HttpMessageConverter messageConverter = new MappingJackson2HttpMessageConverter(); ObjectMapper objectMapper = new ObjectMapper(); SimpleModule simpleModule = new SimpleModule(); /** * 將Long,BigInteger序列化的時候,轉化爲String */ simpleModule.addSerializer(Long.class, ToStringSerializer.instance); simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance); simpleModule.addSerializer(BigInteger.class, ToStringSerializer.instance); objectMapper.registerModule(simpleModule); messageConverter.setObjectMapper(objectMapper); converters.add(messageConverter); }
自此,返回給前端的Long類型就不會丟失精準度了,而是返回了一個字符串,小夥伴們能夠測試一下
到這,文章就結束了!
以上,均爲本人測試而得出的結果,可能會有出入,或者錯誤,歡迎指正
歡迎轉載,請註明出處跟做者,謝謝!