JS的精度不够导致接收后端数据不准确

问题背景:

在后端传输数据的时候,前端接受了17位导致数据的精度不够,数据接收错误

问题产生:

  1. 前端页面ID字段数据丢失,这个就严重了。
  2. JavaScript能处理的数据精度有限,长度一旦超过17位就会发生长度丢失。
  3. 因此,id值在被序列化为JSON时经常会有后几位与原数据匹配不上的问题。

理论解决方法:

  1. 修改Long类型为String,,但缺点很明显,就是失去了Long的优势。,改动太大
    1. (为什么用Long作为Id字段在我的另一篇博客中)
    2. 地址:用Long作为Id的类名的优势-CSDN博客
  2. 在 JavaScript 中,可以使用 BigInt 类型来处理大整数,
    1. BigInt 类型可以表示任意大的整数,
    2. 但是需要注意的是,BigInt 类型只能在较新版本的浏览器中使用。如果需要兼容旧版本浏览器,可以使用第三方库来实现大整数的运算。
  3. 也可以用非侵入式修改,在所有返回Long类型的接口中使用这个自定义的消息转换器,将Long类型转换位String类型

实现:(非侵入式实现)

package com.aqiuo.config;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import java.util.List;

@Configuration
public class WebJsonConverterConfig implements WebMvcConfigurer {

    // 配置Jackson的MappingJackson2HttpMessageConverter
    @Bean
    public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
        // 创建MappingJackson2HttpMessageConverter实例
        MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
        // 获取ObjectMapper实例
        ObjectMapper objectMapper = converter.getObjectMapper();

        // 创建SimpleModule实例,用于配置Jackson模块
        SimpleModule simpleModule = new SimpleModule();
        // 将Long类型序列化为字符串
        simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
        simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance);

        // 注册SimpleModule到ObjectMapper中
        objectMapper.registerModule(simpleModule);

        // 返回配置好的MappingJackson2HttpMessageConverter
        return converter;
    }

    // 扩展HttpMessageConverters,添加自定义的MappingJackson2HttpMessageConverter
    @Override
    public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
        converters.add(mappingJackson2HttpMessageConverter());
    }
}

这样修改了全局的Long类型在传输过程中自动转换为String类型,避免了精度丢失。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五敷有你

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值