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

 

 

到这,文章就结束了!

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

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

 

转载于:https://my.oschina.net/u/2278977/blog/1795819

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值