后端 Long 类型 ID 传给前端精度丢失(变00)的解决方案

在前后端分离的开发中,数据库里存的主键 ID 明明是:1750433246798835714,但是前端接收到数据后,ID 却变成了:1750433246798835700,后几位莫名其妙变成了 0!

导致的结果就是:

前端拿这个错误的 ID 去查询详情或执行删除操作时,后端直接报错"数据不存在",因为 ID 对不上。

原因分析

这个问题的根源在于 Java 和 JavaScript 对数字处理机制的不同。

Java 中的 Long 类型是 64 位有符号整数,它的取值范围非常大;

而常用的雪花算法 (Snowflake) 生成的 ID 通常就是 19 位的,完全在 Java 的 Long 范围内。

JavaScript 中并没有专门的整数类型,所有的数字本质上都是 IEEE 754 标准的双精度浮点数(Double)。

JS 能安全表示的最大整数(Safe Integer)是253-1,这就导致后端的 19 位 ID传给前端时,因为超过了 JS 的安全整数范围,JS 就会发生精度丢失,自动进行"四舍五入"或者直接丢弃低位,导致后几位变成 0。

解决方案

要解决这个问题,最简单有效的方法是:

后端在返回数据给前端时,把 Long 类型的数据统统转换成 String类型。

因为字符串在 JS 里是绝对安全的,不会发生精度丢失。

不需要手动去改每一个 DTO 或 VO 类,只需要在 Spring Boot 中加一个全局配置类,利用 Jackson 的序列化机制自动完成转换。

直接在 config 包下新建一个类JsonConfig.java:

java 复制代码
/**
 * Spring MVC全局Json配置
 * 用于解决 Long 类型精度丢失问题
 */
@JsonComponent
public class JsonConfig {

    /**
     * 全局配置:将 Long 类型序列化为 String
     */
    @Bean
    public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {
        // 创建 ObjectMapper
        ObjectMapper objectMapper = builder.createXmlMapper(false).build();
        
        // 创建自定义序列化模块
        SimpleModule module = new SimpleModule();
        
        // 将 Long 类(包装类)和 long(基本类型)都序列化为字符串
        // ToStringSerializer.instance 会调用对象的 toString() 方法
        module.addSerializer(Long.class, ToStringSerializer.instance);
        module.addSerializer(Long.TYPE, ToStringSerializer.instance);

        // 注册模块
        objectMapper.registerModule(module);
        
        return objectMapper;
    }
}

使用这种全局配置 方案,可以一劳永逸地解决项目中所有 Long 类型精度丢失的问题。

相关推荐
沐晓时光7 分钟前
C语言入门,深入理解指针(6)
c语言·开发语言
略略略咯咯11 分钟前
33333
开发语言·windows·python
计算机魔术师13 分钟前
AI 推翻了一个当了30年地基的假设,查的人恰好是立论者
前端
垆边人似月.14 分钟前
第三篇:函数、文件与异常处理 / Functions, Files & Exception Handling
开发语言·python
云和数据.ChenGuang16 分钟前
项目打开后没有主类
开发语言·人工智能·langchain·1024程序员节
范同学~17 分钟前
项目添加水印
java·前端·javascript
鬼手点金19 分钟前
缓存作为架构约束
开发语言·前端·人工智能·python·microsoft·缓存·架构
月夏20 分钟前
前端第一次接自己的后端:mock 切真接口踩了 2 个坑,组件只改了一行 import
前端·后端·node.js
快乐的韭菜根根21 分钟前
Slurm 指定 GPU 卡:`File=/dev/nvidiaX` 映射的坑与修复
java·服务器·网络
SEO_juper23 分钟前
Node.js 页面主题聚焦度检测:title 和正文各说各的,AI 也读不懂
开发语言·人工智能·node.js·seo·外贸独立站