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类型就不会丢失精准度了,而是返回了一个字符串,小伙伴们能够测试一下

 

 

到这,文章就结束了!

以上,均为本人测试而得出的结果,可能会有出入,或者错误,欢迎指正

欢迎转载,请注明出处跟做者,谢谢!

相关文章
相关标签/搜索