解决java后端的Long型数据id返回前端时,js的数字会丢失精度的问题

为什么Java的id用long但是做JavaWeb项目时id用String而不是long 阅读详情

从后端返回的id是根据雪花算法生成的id,类型为long,这个类型传到后端超过16位的部分会变成0,这就是所谓的丢失进度。

解决方法:将这个long类型的数据转换为String类型

如果我们将涉及到的实体类和属性逐一处理那么必然繁琐,所以可以借助工具类进行全局处理

下面介绍在springboot中一种统一处理方式,就是创建一个WebMvcConfig 配置类并实现 WebMvcConfigurer接口,然后通过实现方法extendMessageConverters来扩展mvc框架的消息转换器**

具体操作步骤:

首先要创建一个对象映射器JacksonObjectMapper继承自ObjectMapper,当然在这个类中可以通过SimpleModule来自定义序列化,如添加日期格式化等,代码如下:

/**
 * 对象映射器:基于jackson将Java对象转为json,或者将json转为Java对象
 * 将JSON解析为Java对象的过程称为 [从JSON反序列化Java对象]
 * 从Java对象生成JSON的过程称为 [序列化Java对象到JSON]
 */
public class JacksonObjectMapper extends ObjectMapper {
​
    public static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd";
    public static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
    public static final String DEFAULT_TIME_FORMAT = "HH:mm:ss";
​
    public JacksonObjectMapper() {
        super();
        //收到未知属性时不报异常
        this.configure(FAIL_ON_UNKNOWN_PROPERTIES, false);
​
        //反序列化时,属性不存在的兼容处理
        this.getDeserializationConfig().withoutFeatures(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
​
​
        SimpleModule simpleModule = new SimpleModule()
                .addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT)))
                .addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT)))
                .addDeserializer(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT)))
​
                .addSerializer(BigInteger.class, ToStringSerializer.instance)
                .addSerializer(Long.class, ToStringSerializer.instance)
​
                .addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT)))
                .addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT)))
                .addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT)));
​
        //注册功能模块 例如,可以添加自定义序列化器和反序列化器
        this.registerModule(simpleModule);
    }
}

​使用SimpleModule.addSerializer方法将java对象序列化到JSON,关键语句如下
.addSerializer(Long.class, ToStringSerializer.instance)

然后创建配置类WebMvcConfig配置类,实现WebMvcConfigure,然后实现extendMessageConverters来扩展消息转换器

@Slf4j
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
​
​
/*
* 扩展mvc框架的消息转换器
* */
    @Override
    public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
​
        log.info("扩展消息转换器...");
​
        //创建消息转换器对象
        MappingJackson2HttpMessageConverter messageConverter = new MappingJackson2HttpMessageConverter();
        //设置对象转换器,底层使用Jackson将java对象转换为json
        messageConverter.setObjectMapper(new JacksonObjectMapper());
       //将上面的消息转换器对象追加到mvc框架的转换器集合中
        converters.add(0,messageConverter);
    }
}

当然在WebMvcConfig implements WebMvcConfigurer也可以使用WebMvcConfig extends WebMvcConfigrationSupport,但是这样配置类的自动配置就失效,那么会出现静态资源无法访问的情况,就需要设置静态资源映射,操作如下

@Slf4j
@Configuration
public class WebMvcConfig extends WebMvcConfigrationSupport{
    //设置静态资源映射
    protected void addResourceHandlers(ResourceHandlerRegistry registry){
        log.info("开始进行静态资源映射")
        registry.addResourceHandler("/backend/**").addResourceLocations("classpath:/backend/");
        registry.addResourceHandler("/front/**").addResourceLocations("classpath:/front/");
        
    }
    
    /*
* 扩展mvc框架的消息转换器
* */
    @Override
    public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
​
        log.info("扩展消息转换器...");
​
        //创建消息转换器对象
        MappingJackson2HttpMessageConverter messageConverter = new MappingJackson2HttpMessageConverter();
        //设置对象转换器,底层使用Jackson将java对象转换为json
        messageConverter.setObjectMapper(new JacksonObjectMapper());
       //将上面的消息转换器对象追加到mvc框架的转换器集合中
        converters.add(0,messageConverter);
    }
}

以上仅为Springboot项目中的配置方式,除此之外在不同开发环境,不同项目都有自己的方式,如Jackson 工具序列化对象或者SpringMVC 配置等方式

解决JavaScript大数ID精度丢失问题 摘要:文章分析了JavaScript处理大数ID时的精度丢失问题,特别是在前后端分离系统中,雪花算法生成的19位Long类型ID超过JavaScript安全整数范围导致数据不一致。提出了使用Jackson的ToStringSerializer将Long类型ID序列化为字符串的解决方案,通过添加@JsonSerialize(using = ToStringSerializer.class)注解实现精确传输,避免前端精度丢失。该方案简单高效,无需修改前端代码,适用于各种分布式ID生成场景,有效解决了常见的大数I 阅读详情

相关推荐

前端JS接收后端的Long长整型数据,并且保证不丢失精度的解决思路

前端与后端对接的途中,有时我们会遇到一些奇怪的坑,例如后端传给前端一个Long类型的数据(可能是某张表的id或是某个随机值),但是前端接收后,数据竟然发生了微妙的变化,这背后的底层原理,就是JS语言number数据类型的精度丢失。

highlighters的博客 1888

JavaScript 无法存储 Java Long 类型数据问题

今天在解决一个需求问题的时候,遇到了一个难得一见的 JS 问题。这个问题大概是和一些同学在开发环境使用 == 来比较包装类型的整数一样,由于比较的数值在缓存范围内,因缘际会的错过了 bug 的出现。简单说一下问题经过,是这样的,笔者这个需求最终要求接口返回一组自定义结构的 k-v (不是单纯的键值对)数据,用于在前端表单中进行分类展示。后端响应的数据结构类似如下: 在前端表单中的展示效果大概如下:笔者相信各位同学都应该猜得到,当提交表单的时候,前端肯定会把选中的镜像的 val 值传递给后端,然后由后端继续进

专注力、洞察力、分享力 1368

后端将Long类型数据传输到前端出现精度丢失的问题(品优购订单号orderId精度丢失问题)

1.数据库中的order_id为Long类型的 (1). TbOrder实体类 @ApiModel(value = "订单表") @Table(name = "tb_order") public class TbOrder implements Serializable { @Id @GeneratedValue(strategy = GenerationType.IDE...

qq_35161159的博客 1268

完美解决!处理精度丢失问题点

解决方式二:全局配置。

m0_63300795的博客 6753

Springboot Long类型数据太长返回给前端,精度丢失问题 复现、解决

Springboot Long类型数据太长返回给前端,精度丢失问题 复现、解决

默默不代表沉默 5282

国密SSL实战:手把手教你用Wireshark抓包分析GMTLS协议(附证书链验证技巧)

本文提供了一份国密SSL(GMTLS)协议的实战抓包分析指南。通过详细讲解Wireshark的配置、GMTLS握手流程的捕获与筛选,以及双证书机制和证书链的深度解析,帮助工程师和开发人员掌握使用Wireshark排查国密SSL连接问题、进行密评和协议调试的核心技巧。

rgv234567的博客 502

Java ~ 关于后端向前端传值时数字类型的精度损失问题

@JsonSerialize注解会自主将数字类型转变为字符串进行传输。

说淑人的所思所想 3379

几率大的Redis面试题(含答案)

本文的面试题如下: Redis 持久化机制 缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级等问题 热点数据和冷数据是什么 Memcache与Redis的区别都有哪些? 单线程的redis为什么这么快 redis的数据类型,以及每种数据类型的使用场景,Redis 内部结构 redis的过期策略以及内存淘汰机制【~】 Redis 为什么是单线程的,优点 如何解决redis的并发竞争key问题 Red...

睶 38万+

后端如何处理前端id精度丢失的问题

后端如何处理前端id精度丢失的问题

weixin_44589578的博客 1269

DeepSeek+Dify实战:零代码构建智能SQL生成器

本文详细介绍了如何利用DeepSeek和Dify零代码构建智能SQL生成器,帮助非技术人员通过自然语言查询数据库。文章涵盖从数据准备、知识库设计到Agent配置的全流程,并提供了优化技巧和实际应用案例,显著提升团队数据查询效率。

weixin_29311017的博客 418

2024年数字IC秋招-海康威视-数字逻辑设计工程师-笔试题

笔试题型:单选 + 多选笔试平台:百一测试(电脑监控)笔试时间:1h30minA. AW通道B. D通道C. B通道D. AR通道return x++;x = 5;y = Foo(x);

qq_42135020的博客 3199

Spring-boot项目练习笔记(一)JS处理Long型数据精度丢失问题

JavaScript(JS)处理Long型数据精度丢失问题,根据雪花算法生成的id修改数据失败问题。

赵四司机的博客 1140

python全栈入门到实战【基础篇 02】环境搭建:Python解释器与PyCharm、VSCode编辑器安装配置详解

本文详解Python环境搭建步骤。首先安装解释器(运行代码核心),需从官网下载,选3.8及以上版本(勿选2.x)。Windows安装必勾“Add Python.exe to PATH”,验证用`python --version`;Mac选universal2安装包,验证用`python3 --version`。 编辑器二选一:PyCharm社区版(免费,新手推荐),安装后需配置解释器路径;VSCode轻量,需装Python插件并选择解释器。

那些看似不起波澜的日复一日,会在某天让你看到坚持的意义 5万+

解决前端精度丢失问题:后端Long类型到前端的处理策略

前端精度丢失问题是一个常见的挑战,但通过上述三种方法,我们可以有效地解决这个问题。在实际开发中,我们可以根据项目的具体情况和需求选择合适的方法。对于需要精确表示大数字的场景,将Long类型转换为String类型是一个简单而有效的解决方案。

qq_41591215的博客 1万+

【unity实战】Unity2D TileMap的探究(最简单,最全面的TileMap使用介绍)

之前有人在微信上找我,问了TileMap相关的知识【unity实战】随机地下城生成2——绘制地图Tilemap的使用及一些技巧的使用(含源码)不过写的不是特别不是特别细致,只是简单的用了一下,所有这次特地打算单独写一篇文章,来介绍一下,下次还有人问我,我直接就把这篇文章丢给他,完美!Unity的Tilemap 一般称之为瓦片地图或者平铺地图,是 Unity2017 中新增的功能,主要用于快速编辑 2D 游戏中的场景,通过复用资源的形式提升地图多样性。Tilemap是一个用于创建2D地图的工具。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 1万+

计算机毕设:线性回归 Xgboost LSTM 预测黄金价格实战 完整代码数据视频讲解 可直接运行

线性回归 Xgboost LSTM 预测黄金价格实战 完整代码数据视频讲解 可直接运行

1760

前后端联调中 Long 类型 ID 精度丢失问题

摘要:前后端联调时,Long类型ID因JS数值精度限制(仅支持53位整数)导致精度丢失,表现为"假删除"现象。解决方案:1)后端序列化Long为String(推荐);2)前端使用json-bigint解析;3)DTO层隔离数据库类型。核心矛盾在于JS的Number类型与Java的long类型范围差异,最佳实践是后端统一返回字符串ID,从源头规避问题。

喜欢敲代码 2146

SOI LDMOS器件的Sentaurus TCAD建模与关键电学特性仿真研究

本文研究了SOI LDMOS器件的TCAD建模与电学特性仿真。通过Sentaurus TCAD平台建立了单RESURF结构的SOI LDMOS模型,详细阐述了器件结构原理和RESURF耐压机制。研究采用SDE进行几何定义和掺杂配置,在Sentaurus Device中构建了完整的物理模型体系,包括迁移率、复合和碰撞电离模型。通过系统仿真提取了器件的转移特性、输出特性和击穿特性等关键参数,分析了各参数对性能的影响规律。研究结果为功率半导体器件的仿真建模提供了规范化参考,有助于优化SOI LDMOS的性能设计。

huanghm88的专栏 134

long类型返回前端精度丢失

在阅读《阿里巴巴Java开发手册》时,发现有一条关于前后端超大整数返回的规约,具体内容如下: 这个问题在之前和前端联调的时候发生过,发现根据脚本 id 去审批的时候,状态没有变化,后来和前端沟通后,才知道这是 JavaScript 的一个坑,下面来复现下这个错误: 错误演示 创建一个 Spring Boot 项目,然后在新建一个接口,可以返回 DbScript 对象,其中 id 是由 mybatis-plus 的 IdWorker.getId(基于 Snowflake 算法)生成的 19 位 long 类

Mr1ght的博客 1万+

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Long类型后端到前端精度丢失问题

在后端开发中处理Long类型数据时,注意 JavaScript 的精度限制十分重要。通过配置 Jackson 的,可以让所有Long类型字段序列化为字符串,从而避免精度丢失的问题。Spring Boot 的自动化配置特性让我们无需手动调用,就能在全局范围内应用此配置,使得后端传递到前端的数据在大数值时也能准确无误。

qq_44199605的博客 2120

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

SpringBoot后端Long类型ID传前端精度丢失?3种配置Jackson的终极解决方案

本文详细解析了SpringBoot后端Long类型ID传前端精度丢失问题,提供了3种配置Jackson的解决方案:字段级注解、全局ObjectMapper配置和自定义序列化器。针对JavaScript的数字精度限制,文章还介绍了前端使用BigInt和json-bigint库的处理方法,帮助开发者彻底解决ID精度丢失问题。

z5a6b的博客 971

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

SpringBoot--解决雪花算法主键ID传到前端后精度丢失问题

本文用示例介绍SpringBoot如何解决雪花算法主键ID传到前端后精度丢失问题。

IT利刃出鞘的博客 4178

Spring Boot返回前端Long型丢失精度

最近为Prong开发了一个基于snowflake算法的Java分布式ID组件,将实体主键从原来的String类型的UUID修改成了Long型的分布式ID。修改后发现前端显示的ID和数据库中的ID不一致。例如数据库中存储的是:812782555915911412,显示出来却成了812782555915911400,后面2位变成了0,精度丢失了: console.log(812782555915911412); 812782555915911400 这是什么原因呢? 原来,JavaScript中数字的精度是有

qq_35448165的博客 2646

Long类型返回前端精度丢失

如果使用的是Jackson,它有个配置参数 WRITE_NUMBERS_AS_STRINGS,可以强制将所有数字全部转成字符串输出,使用方法很简单,只需要配置参数即可:spring.jackson.generator.write_numbers_as_strings=true,这种方式的优点是使用方便,不需要调整代码;,这种只适用于这个对象只在这个方法中使用了,比较局限。(2)如果这个对象在很多地方都用到了,可以在序列化的时候,将 Long 类型转换成 String 类型。为什么会发生这样的情况呢?

weixin_44823875的博客 3680

《长得太长也是错?——后端 Long 型 ID 精度丢失的“奇妙”修复之旅》

虽然上面的方法已经可以解决大多数问题,但有时候我们会遇到一些需要更细粒度控制的场景。这时候,Jackson的自定义序列化器就派上用场了。我们可以编写一个自定义的序列化器,根据需求灵活控制Long类型字段的序列化过程。比如,我们可以在序列化时决定是否将Longif(value!

繁依Fanyi的博客 1408
上一篇: SpringBoot集成JWT
Ethan_Zhuo
博客等级 码龄6年 2粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

Ethan_Zhuo

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

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

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

打赏作者

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

抵扣说明:

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

余额充值