个人随笔
SpringBoot页面展示超长Long类型的值精度失效的解决办法
2020-09-11 22:38:30

之前在SpringBoot2.0.0的时候,我就遇到了这个问题,然后网上说有三种解决方案,如下:

方法一

在实体类的Long字段上加上注解即可

  1. @JsonSerialize(using=ToStringSerializer.class)
  2. private Long id;//主键ID,雪花算法生成

指定了ToStringSerializer进行序列化,将数字编码成字符串格式。这种方式的优点是颗粒度可以很精细;缺点同样是太精细,如果需要调整的字段比较多会比较麻烦。

方法二

Jackson有个配置参数WRITE_NUMBERS_AS_STRINGS,可以强制将所有数字全部转成字符串输出。其功能介绍为:Feature that forces all Java numbers to be written as JSON strings.。使用方法很简单,只需要配置参数即可:

  1. spring:
  2. jackson:
  3. generator:
  4. write_numbers_as_strings: true

这种方式的优点是使用方便,不需要调整代码;缺点是颗粒度太大,所有的数字都被转成字符串输出了,如果有些必须是Long的就会有问题,比如我的上传图片markdown编辑器,必须返回Long的标志,所以这种方法不行。

方案三

  1. @Configuration
  2. public class WebDataConvertConfig implements WebMvcConfigurer {
  3. public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
  4. MappingJackson2HttpMessageConverter jackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();
  5. ObjectMapper objectMapper = new ObjectMapper();
  6. //序列换成json时,将所有的long变成string.因为js中得数字类型不能包含所有的java long值
  7. SimpleModule simpleModule = new SimpleModule();
  8. simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
  9. simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance);
  10. objectMapper.registerModule(simpleModule);
  11. jackson2HttpMessageConverter.setObjectMapper(objectMapper);
  12. converters.add(jackson2HttpMessageConverter);
  13. }
  14. }

嗯在SpringBoot2.0.0的时候,我用的是方案二,没问题,但是因为升级SpringBoot导致这种方式也不知道为什么就是不行,所以最后我用了方案1.
:bowtie:

 7
有疑问发邮件到 : suibibk@qq.com 侵权立删
Copyright : 个人随笔   备案号 : 粤ICP备18099399号-2