Z次元
文章 笔记 日志
专题
专栏分类 文章归档
友链
友情链接 朋友圈
交流
留言 关于我
头像
系列文章
-
-
-
-
后端传递Long类型数值,前端接收精度丢失(失真)问题
系列文章
知识积累
最后更新:2024/12/15|创建时间:2023/9/20

这篇文章讨论了后端传递 Long 类型数值到前端时的精度丢失问题,主要原因是前端只能接收最多16位数字。为解决此问题,提出了两种方案:一是自定义消息转换器,将 Long 类型数据转换为 String 类型;二是在实体类属性上使用 @JsonSerialize 注解,确保 Long 类型正确显示。两种方案均有效,适用于不同场景。

前言

最近在写评论插件时,id使用雪花算法生成(Long),结果传递到前端时发现id最后几位精度丢失全变成了0。

后面经过几番排查后发现前端能够接收的数字最多只能是16位,所以会造成精度丢失。

图片

图片

可以看到后端传递的数据是没有任何问题的,但是接收时精度就丢失了。

在考虑到不改变业务结构的情况下,有两种解决方案。

方案一:自定义消息转换器

通过自定义消息转换器,将传递给前端的Long类型数据转换为String类型数据。

这个方法会将所有传到前端的Long类型转为String。

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.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 DataConfig implements WebMvcConfigurer {

    /**
     * 将 Long类型数据转为String
     * @param converters
     */
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        MappingJackson2HttpMessageConverter mJHttpMessageConverter = new MappingJackson2HttpMessageConverter();
        ObjectMapper objectMapper = mJHttpMessageConverter.getObjectMapper();
        SimpleModule simpleModule = new SimpleModule();
        simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
        simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance);
        objectMapper.registerModule(simpleModule);
        mJHttpMessageConverter.setObjectMapper(objectMapper);
        converters.add(0, mJHttpMessageConverter);
    }

}

图片

可以看到前端接收的数据已经是正常显示了

方案二:注解

在需要转化的实体类属性加上注解。也可以实现和上面同样的效果。

比如id字段:

import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import lombok.Data;

@Data
public class Comment {

    @JsonSerialize(using = ToStringSerializer.class)
    private Long id;
  
    private String ahzoo;
   
}
版权声明
本文依据 CC-BY-NC-SA 4.0 许可协议授权,请您在转载时注明文章来源为 Z次元 ,若本文涉及转载第三方内容,请您一同注明。
更多专栏文章推荐
知识积累
人非生而知之者,孰能无惑?惑而不从师,其为惑也,终不解矣。
Docker——容器化部署(进阶篇)
2023/7/22
Docker——容器化部署(基础篇)
2023/7/22
JDK新版特性(18-21)
2025/2/7
JDK新版特性(11-17)
2025/1/30
评论区
发表评论

这里还没有评论哦

快来发一条评论抢占前排吧

前言
方案一:自定义消息转换器
方案二:注解
目录
前言
方案一:自定义消息转换器
方案二:注解
十玖八柒
每天进步多一点
欢迎到访φ(゜▽゜*)♪
最新评论
个人占星:

想给自己的网站弄个统计功能,但不会弄,头疼

永恒末匕:

好哇塞,这个厉害

十玖八柒:

测试图片发送

Corwin: @十玖八柒

哎 主要是我的个人网站用的是静态的cos 实现评论框还是有点困难

我的
个人主页
站点地图
RSS订阅
导航
十年之约
虫洞穿梭
全站友链
虚位以待
©2020 - 2025 By 十玖八柒 版权所有
豫ICP备20021466号