已经很久没写过springboot的相关博客了,前面一段时间一直在写clojure,导致基本很少关注springboot的一些情况,刚好最近在写一些小玩意,期间,遇到一些问题,然后整理了一下,避免其他小伙伴跟我遇到一样的问题,而浪费时间
先介绍一下开发环境:
- JDK版本1.8
- springboot的版本是 1.5.2
- 开发工具为 intellij idea
- 开发环境为 15款MacBook Pro
问题介绍,在springboot跟spring返回json的数据中,如果long类型超过18位长度,会导致前端js接收参数丢失精准度问题
------------------------------------分割线-------------------------------
出现以上问题,我们有2个解决方案.
- 我们将每个Long类型都手动转换成字符串
- 我们将返回给前端数据之前,序列化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类型就不会丢失精准度了,而是返回了一个字符串,小伙伴们可以测试一下
到这,文章就结束了!
以上,均为本人测试而得出的结果,可能会有出入,或者错误,欢迎指正
欢迎转载,请注明出处跟作者,谢谢!
来源:oschina
链接:https://my.oschina.net/u/2278977/blog/1795819