• Long类型的数据,后端传给前端产生的精度丢失问题


    问题出现

    后端的Java Bean的id属性是用的Long类型对应数据库主键使用bigint类型,当使用JSON方式传递该数据给前端时,前端接收到的数据末尾会变成0。(发生的精度丢失问题)

    问题原因

    Java中的long能表示的范围比js中number大,也就意味着部分数值在js中存不下(变成不准确的值),导致Id最后几位直接变成了0。

    解决方案

    将后端的id变成字符串类型,前端以字符串的方式接收就不会有精度丢失

    方案一:Jackson

    单个配置

    在Long类型字段上加序列化注解

    1. @JsonSerialize(using = ToStringSerializer.class)
    2. private Long id;

    统一配置

    需要每一个都指定注解,比较麻烦,下面是统一配置

    1. import com.fasterxml.jackson.databind.ObjectMapper;
    2. import com.fasterxml.jackson.databind.module.SimpleModule;
    3. import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
    4. import org.springframework.context.annotation.Bean;
    5. import org.springframework.context.annotation.Configuration;
    6. import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
    7. @Configuration
    8. public class JacksonConfig {
    9. @Bean
    10. @Primary
    11. @ConditionalOnMissingBean(ObjectMapper.class)
    12. public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {
    13. ObjectMapper objectMapper = builder.createXmlMapper(false).build();
    14. SimpleModule simpleModule = new SimpleModule();
    15. //Long类型----String
    16. simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
    17. objectMapper.registerModule(simpleModule);
    18. return objectMapper;
    19. }
    20. }

    方案二:FastJSON

    单个配置

    在Long类型字段上加注解Long转String

    1. @JSONField(serializeUsing = ToStringSerializer.class)
    2. private Long userId;

    统一配置

    通过重写WebMvcConfigurer中的configureMessageConverters方法来重新配置转换器

    1. import com.alibaba.fastjson.serializer.SerializeConfig;
    2. import com.alibaba.fastjson.serializer.ToStringSerializer;
    3. import com.alibaba.fastjson.support.config.FastJsonConfig;
    4. import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
    5. import org.springframework.context.annotation.Bean;
    6. import org.springframework.context.annotation.Configuration;
    7. @Configuration
    8. public class CustomFastJsonConfig {
    9. @Bean
    10. FastJsonHttpMessageConverter fastJsonHttpMessageConverter() {
    11. //1.需要定义一个convert转换消息的对象
    12. FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
    13. //2.添加fastJson的配置信息
    14. FastJsonConfig fastJsonConfig = new FastJsonConfig();
    15. //3.设置Long为字符串
    16. SerializeConfig serializeConfig = SerializeConfig.globalInstance;
    17. serializeConfig.put(Long.class, ToStringSerializer.instance);
    18. serializeConfig.put(Long.TYPE, ToStringSerializer.instance);
    19. fastJsonConfig.setSerializeConfig(serializeConfig);
    20. //4.在convert中添加配置信息.
    21. converter.setFastJsonConfig(fastJsonConfig);
    22. return converter;
    23. }
    24. }

    后端返回的数据,只要是Long类型的字段,都会被转成String返回,导致扩大了转换范围,不过可以解决所有long类型带来的问题。

    注意点

    单个属性配置注解的时候:

    • FastJSON使用FastJSON下的ToStringSerializer
    • Jackson使用Jackson下的ToStringSerializer
  • 相关阅读:
    【Kubernetes】资源指标管道——部署Metrics Server
    (2D、3D效果)转换有哪些?
    Java代码审计rce漏洞
    基于单片机16路抢答器仿真系统
    JVM(Java虚拟机)练习题目大全
    ceph 007 双向池同步 rgw对象网关配置 s3对象存储
    一起Talk Android吧(第四百一十二回:Math类常用方法介绍)
    Reka Core, Flash, and Edge: A Series of Powerful Multimodal Language Models
    nodelist 与 HTMLCollection 的区别
    Java常用类String
  • 原文地址:https://blog.csdn.net/m0_56750901/article/details/127444628