SpringBoot,返回JSON,Long前端精準度丟失,Jackson自定義序列化規則

已經好久沒寫過springboot的相關博客了,前面一段時間一直在寫clojure,致使基本不多關注springboot的一些狀況,恰好最近在寫一些小玩意,期間,遇到一些問題,而後整理了一下,避免其餘小夥伴跟我遇到同樣的問題,而浪費時間前端

 

先介紹一下開發環境:java

  1.  JDK版本1.8
  2. springboot的版本是 1.5.2
  3. 開發工具爲 intellij idea
  4. 開發環境爲 15款MacBook Pro

 

 

問題介紹,在springboot跟spring返回json的數據中,若是long類型超過18位長度,會致使前端js接收參數丟失精準度問題web

 

------------------------------------分割線-------------------------------spring

出現以上問題,咱們有2個解決方案.json

  1. 咱們將每一個Long類型都手動轉換成字符串
  2. 咱們將返回給前端數據以前,序列化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類型就不會丟失精準度了,而是返回了一個字符串,小夥伴們能夠測試一下

 

 

到這,文章就結束了!

以上,均爲本人測試而得出的結果,可能會有出入,或者錯誤,歡迎指正

歡迎轉載,請註明出處跟做者,謝謝!

相關文章
相關標籤/搜索