mybatis-plus雪花算法自动生成ID到前端后精度丢失问题及解决
问题发生
前端接收到后端的数据出现异常,异常如下:
如图这是后端正常返回的数据,

但是点击预览时发现这个id的数据被改变了

这就导致了我通过id去修改相关数据时无法成功
问题原因
id的长度过长(19位),前端js的Number类型精度为16位,所以导致数据格式化精度丢失
这个id是我用mybatis-plus的雪花算法自动生成的,后端实体类似如下:

后端实体参数使用Long类型是没有任何问题的,关键就在于Long类型到前端后在解析json时候会被解析为Number类型导致精度缺失。
问题解决
方案一
修改后端全部实体的id为String类型,并且修改数据库类型
方案二
优化后端返回给前端数据时候的JSON序列化,将Long类型转变为String响应给前端
**注:**在springBoot应用中默认使用Jackson进行JSON序列化响应数据给前端
package com.newblog.security.config;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
/**
* <p>
*
* </p>
*
* @author:雷子杰
* @date:2023/12/10
*/
@Configuration
public class JacksonConfig {
@Bean
@Primary
@ConditionalOnMissingBean(ObjectMapper.class)
public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder)
{
ObjectMapper objectMapper = builder.createXmlMapper(false).build();
// 全局配置序列化返回 JSON 处理
SimpleModule simpleModule = new SimpleModule();
//JSON Long ==> String
simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
objectMapper.registerModule(simpleModule);
return objectMapper;
}
}
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
SpringBoot整合Thymeleaf与FreeMarker视图层技术
在目前的企业级应用开发中,前后端分离是趋势,但是视图层技术还占有一席之地。Spring Boot 对视图层技术提供了很好的支持,福安防推荐使用的模板引擎是Thymeleaf,不过想FreeMarker也支持,JSP技术在这里并不推荐使用2022-08-08
SpringBoot集成Hadoop对HDFS的文件操作方法
这篇文章主要介绍了SpringBoot集成Hadoop对HDFS的文件操作方法,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧2024-07-07
Java后端必会Linux常用命令之一篇搞懂日志、进程、端口、部署
掌握Linux命令行是开发者的必备技能,本文用最简方式梳理高频基础命令,每个命令配常用示例,适合新手快速查阅,这篇文章主要介绍了Java后端必会Linux常用命令之一篇搞懂日志、进程、端口、部署的相关资料,需要的朋友可以参考下2026-05-05


最新评论