前后端分离,Jackson,Long精度丢失

案例:后端接口放回一个Long数据

复制代码
    @GetMapping("/testForLong")
    public Map<String, Object> testForLong() {

        Map<String, Object> map = new HashMap<>();
        map.put("aaa", 1234567890123456789L);

        return map;
    }

实际前端接收的数据

前后端数据不一致。这是因为JavaScript中的数字一律采用IEEE-754标准的64位浮点数表示,这种格式可以很好地处理大多数数字运算,但对于非常大的整数(超出2^53 - 1),就可能出现精度损失,这就非常的恶心了,可能会让你感到莫名其妙。当从后端获取到Long类型的值并尝试在前端展示时,如果该值超过了JavaScript安全整数范围,那么显示的结果可能不准确。

如何解决:

全局解决方案:项目中所有的Long都会被转换为String进行输出。

java 复制代码
@Component
public class PackMapperCustomizer implements Jackson2ObjectMapperBuilderCustomizer {
    @Override
    public void customize(Jackson2ObjectMapperBuilder jacksonObjectMapperBuilder) {
        jacksonObjectMapperBuilder.serializerByType(Long.class, ToStringSerializer.instance);
    }
}

某个字段单独处理:

java 复制代码
@Data
public class TestVo {

    @JsonSerialize(using = ToStringSerializer.class)
    private Long id;
    
    private String name;
    private Long code;
}
相关推荐
朦胧之13 小时前
AI 编程-老项目改造篇
java·前端·后端
程序猿大帅17 小时前
别再只当调包侠了:用 Spring AI 落地 Function Calling,我被大模型硬生生砸出了三个大坑
java
程序员晓琪18 小时前
约定大于配置:基于 Java 包名自动生成 API 版本路由的最佳实践
java·spring boot·后端
Flittly18 小时前
【AgentScope Java新手村系列】(11)中断与恢复
java·spring boot·spring
众少成多积小致巨19 小时前
JNI (Java Native Interface) 技术手册中文参考指南
android·java·c++
东坡白菜19 小时前
破局全栈:前端开发的Java入门实战记录—JPA(2)
java·后端
SimonKing1 天前
艹,维护AI写的代码,我心态崩了......
java·后端·程序员
用户298698530141 天前
Java Word 文档样式进阶:段落与文本背景色设置完全指南
java·后端
小bo波2 天前
从"任意文件复制"深挖Java I/O:字符流与字节流的本质抉择
java·nio·io流·后端开发·文件复制
nanxun8863 天前
记一次诡异的 Docker 容器"串包"故障排查
java