已经好久没写过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类型就不会丢失精准度了,而是返回了一个字符串,小伙伴们能够测试一下
到这,文章就结束了!
以上,均为本人测试而得出的结果,可能会有出入,或者错误,欢迎指正
欢迎转载,请注明出处跟做者,谢谢!