解决Long类型前端精度丢失和正常传回后端问题

在 Java 后端开发中,可能会遇到前后端交互过程中 Long 类型精度丢失的问题。尤其是在 JavaScript 中,由于其 Number 类型是双精度浮点数,超过 16 位的 Long 类型值就会发生精度丢失。

问题背景

假设有如下实体类:

public class TemplateValue implements Serializable {private Long colHeadId;private Long rowHeadId;private String val1;private String val2;
}

这在后端没有问题,但如果前端直接接收这个数据,colHeadId rowHeadId 可能会在 JS 中出现精度问题,比如:

{"colHeadId": 1234567890123456789
}
1234567890123456770  // 精度丢失!

解决方案:Long 类型转 String 传给前端

为了解决这个问题,我们需要在序列化时将 Long 类型转成 String,即使用:

@JsonSerialize(using = ToStringSerializer.class)

同时,前端传来的 String 要转回 Long 怎么办?

这就是本文的重点!序列化做了,反序列化没做,就会出现类型转换失败或数据无法接收的问题。

那么我们需要自定义一个反序列化器,将前端传来的 String 自动转成 Long 类型。

实现步骤

1.创建自定义反序列化器 ToLongDeserializer

可以放在工具类里

package com.yourproject.util;import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import java.io.IOException;public class ToLongDeserializer extends JsonDeserializer<Long> {@Overridepublic Long deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {String value = p.getText();try {return value != null ? Long.parseLong(value) : null;} catch (NumberFormatException e) {throw new IOException("Invalid long value: " + value, e);}}
}
2. 在实体类上使用序列化 & 反序列化注解
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.yourproject.util.ToLongDeserializer;public class TemplateValue implements Serializable {@JsonSerialize(using = ToStringSerializer.class)@JsonDeserialize(using = ToLongDeserializer.class)private Long colHeadId;@JsonSerialize(using = ToStringSerializer.class)@JsonDeserialize(using = ToLongDeserializer.class)private Long rowHeadId;private String val1;private String val2;
}

这样,在前后端交互时就能做到:

  • 后端返回数据时将 Long -> String,避免精度丢失;

  • 后端接收前端数据时将 String -> Long,方便业务逻辑处理。

总结

前后端交互中,涉及 Long 类型字段时:

  • 必须序列化为 String,@JsonSerialize(using = ToStringSerializer.class),避免前端精度丢失

  • 如果需要将数据回传给后端,必须反序列化为 Long,创建自定义反序列化器,确保后端能正常接收

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/900771.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PowerPhotos:拯救你的Mac照片库,告别苹果原生应用的局限

如果你用Mac管理照片&#xff0c;大概率被苹果原生「照片」应用折磨过——无法真正并行操作多个图库。每次切换图库都要关闭重启&#xff0c;想合并照片得手动导出导入&#xff0c;重复文件更是无处可逃…… 直到我发现了 PowerPhotos&#xff0c;这款专为Mac设计的照片库管理…

android 14.0 工厂模式 测试音频的一些问题(高通)

1之前用tinycap&#xff0c;现在得用agmcap 执行----agmcap /data/test.wav -D 100 -d 101 -i CODEC_DMA-LPAIF_RXTX-TX-3 -T 3 报错1 agmcap data/test.wav -D 100 -d 101 -i CODEC_DMA-LPAIF_RXTX-TX-3 -T 3 Failed to open xml file name /vendor/etc/backend_co…

以库存系统为核心的ERP底层架构设计

在企业资源计划&#xff08;ERP&#xff09;系统中&#xff0c;库存系统常被视为基础模块。但在现代企业的数字化进程中&#xff0c;库存系统不仅仅是一个模块&#xff0c;它已经逐步演化为驱动整个ERP生态的核心引擎。本文从架构设计的角度&#xff0c;探讨为何库存系统应被置…

辛格迪客户案例 | 北京舒曼德医药实施电子合约系统(eSign)

01 北京舒曼德医药科技开发有限公司&#xff1a;医药科技的数字化先锋 北京舒曼德医药科技开发有限公司&#xff08;以下简称“舒曼德医药”&#xff09;作为国内医药科技领域的领军企业&#xff0c;致力于创新药物的研发、临床试验和市场推广。公司以“科技兴药、质量为先、服…

【UE5】RTS游戏的框选功能+行军线效果实现

目录 效果 步骤 一、项目准备 二、框选NPC并移动到指定地点 三、框选效果 效果 步骤 一、项目准备 1. 新建一个俯视角游戏工程 2. 新建一个pawn、玩家控制器和游戏模式,这里分别命名为“MyPawn”、“MyController”和“MyGameMode” 3. 打开“MyGameMode”,设置玩家…

vim定位有问题的脚本/插件的一般方法

在使用vim的过程中可能会遇到一些报错或其他不符合预期的情况&#xff0c;本文介绍一些我自己常用的定位有问题脚本/插件的方法&#xff08;以下方法同样适用于neovim&#xff09; 执行了某些命令的情况 这种情况最简单&#xff0c;使用:h 命令&#xff0c;如果插件有文档的话…

智能驱动教育变革:人工智能在高中教育中的实践路径与创新策略

一、引言 随着信息技术的飞速发展&#xff0c;人工智能&#xff08;Artificial Intelligence, AI&#xff09;已成为推动社会进步的重要力量。在教育领域&#xff0c;人工智能的应用正逐渐改变着传统的教学模式和方法&#xff0c;为教育现代化注入了新的活力。高中教育作为教育…

VLAN(虚拟局域网)

一、vlan概述 VLAN(virtual local area network)是一种通过逻辑方式划分网络的技术&#xff0c;允许将一个物理网络划分为多个独立的虚拟网络。每一个vlan是一个广播域&#xff0c;不同vlan之间的通信需要通过路由器或三层交换机 [!注意] vlan是交换机独有的技术&#xff0c;P…

spring-cloud-starter-alibaba-seata使用说明

Spring Cloud Alibaba Seata 使用说明 spring-cloud-starter-alibaba-seata 是 Spring Cloud Alibaba 生态中用于集成分布式事务框架 Seata 的核心组件&#xff0c;支持 AT&#xff08;自动补偿&#xff09;、TCC&#xff08;手动补偿&#xff09; 等模式。 一、依赖配置 添加…

每日一题(小白)暴力娱乐篇23

由题意得知给我们一串数字&#xff0c;我们每次交换两位&#xff0c;最少交换多少次成功得到有顺序的数组。我们以平常的思维去思考&#xff0c;加入给你一串数字获得最少的交换次数&#xff0c;意味着你的交换后续基本不会变&#xff0c;比如说2 1 3 5 4 中1与2交换后不变&…

Python基础——Pandas库

对象的创建 导入 Pandas 时&#xff0c;通常给其一个别名“pd”&#xff0c;即 import pandas as pd。作为标签库&#xff0c;Pandas 对象在 NumPy 数组基础上给予其行列标签。可以说&#xff0c;列表之于字典&#xff0c;就如 NumPy 之于 Pandas。Pandas 中&#xff0c;所有数…

Spring入门概念 以及入门案例

Spring入门案例 Springspring是什么spring的狭义与广义spring的两个核心模块IoCAOP Spring framework特点spring入门案例不用new方法&#xff0c;如何使用返回创建的对象 容器&#xff1a;IoC控制反转依赖注入 Spring spring是什么 spring是一款主流的Java EE轻量级开源框架 …

The packaging for this project did not assign a file to the build artifact

问题&#xff1a; maven install报错&#xff1a;The packaging for this project did not assign a file to the build artifact 解决方案&#xff1a; 方案1&#xff1a; 使用mvn clean install 就可以解决问题&#xff0c; 方案2&#xff1a; 找到lifecycle点clean再点…

C++入门一:C++ 编程概述

一、C 语言与 C 的关系&#xff1a;从 “带类的 C” 到独立王国 1.1 血缘关系&#xff1a;C 是 C 的 “超级进化版” 起源&#xff1a;C 由 Bjarne Stroustrup 在 1980 年代开发&#xff0c;最初名为 “C with Classes”&#xff08;带类的 C&#xff09;&#xff0c;旨在为 …

LLM生成文本的 束搜索参数是什么(Beam Search)

LLM生成文本的 束搜索参数是什么(Beam Search) 束搜索(Beam Search)是一种在序列生成任务(如机器翻译、文本生成等)中常用的启发式搜索算法,用于在搜索空间中寻找最优的生成序列。 束搜索的基本概念 在序列生成过程中,每一步都会有多个可能的选择(即候选标记)。 …

Java-多级排序结合thenComparing()

List<User>,user有个字段有值的时候设置1,没值就是null,怎么排序根据这个字段排序? 若要对 List<User> 按照某个字段(如 flag,有值时为 1,无值时为 null)排序,可 以使用 ​​Comparator​​ 结合 null 值处理逻辑。 1. 排序规则说明​​ 假设需求是:…

卷积神经网络(CNN)基础

目录 一、应用场景 二、卷积神经网络的结构 1. 输入层&#xff08;Input Layer&#xff09; 2. 卷积层&#xff08;Convolutional Layer&#xff09; 3. 池化层&#xff08;Pooling Layer&#xff09; 最大池化&#xff08;max_pooling&#xff09;或平均池化&#xff08;…

Android 中集成 Unity 工程的步骤

在 Adroid 项目中集成 Unity 工程,主要步骤如下: 一、前提条件 1、已有一个 Android 工程项目; 2、Unity 工程已导出为 Android 工程,目录大概如下: 二、集成步骤 1、在 Android 工程中导入 Unity 工程的 unityLibrary 模块。 在 Android Studio 中,点击菜单栏 Fil…

热Key问题及其解决方案:Redis高并发场景下的性能优化

目录 一、热Key问题的本质与影响 1.1 什么是热Key&#xff1f; 典型热Key场景&#xff1a; 1.2 热Key造成的技术挑战与业务影响 技术层面影响&#xff1a; 业务层面影响&#xff1a; 二、热Key的科学判定与识别方法 2.1 定量判定标准 QPS集中度指标 资源消耗指标 2.…

2025年智能 ITSM产品推荐

2025年数字经济占GDP比重将突破62%&#xff0c;IT服务管理&#xff08;ITSM&#xff09;系统已成为企业核心竞争力的"数字底座"。根据IDC最新报告&#xff0c;采用AI驱动的智能ITSM系统可使企业运营效率提升41%&#xff0c;故障恢复成本降低58%。本文从智能化水平、产…