SpringBoot,返回JSON,Long前端精准度丢失,Jackson自定义序列化规则

已经很久没写过springboot的相关博客了,前面一段时间一直在写clojure,导致基本很少关注springboot的一些情况,刚好最近在写一些小玩意,期间,遇到一些问题,然后整理了一下,避免其他小伙伴跟我遇到一样的问题,而浪费时间

先介绍一下开发环境:

  1.  JDK版本1.8
  2. springboot的版本是 1.5.2
  3. 开发工具为 intellij idea
  4. 开发环境为 15款MacBook Pro

问题介绍,在springboot跟spring返回json的数据中,如果long类型超过18位长度,会导致前端js接收参数丢失精准度问题

------------------------------------分割线-------------------------------

出现以上问题,我们有2个解决方案.

  1. 我们将每个Long类型都手动转换成字符串
  2. 我们将返回给前端数据之前,序列化json的时候在指定将Long或者其他的转换成我们指定的类型

显然,第一种很繁琐.所有地方都要处理,第二种更合理,在序列化的时候做统一的处理,将类型转换了,我们就来弄第二种吧.

------------------------------------show code-------------------------------

首先,我们都知道,springmvc返回给前端的消息转换接口是 

HttpMessageConverter

,所以,我们需要替换掉以接口的实现,变成我们自定义的实现,或者在原来规则下,添加新的规则.

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

到这,文章就结束了!

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

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

猜你喜欢

转载自my.oschina.net/u/2278977/blog/1795819