当前位置: 首页 > news >正文

优雅处理枚举前端丢失大Long精度问题

1. 枚举-json处理(前端 <=> 后端 <=> 数据库)

前端传递 枚举code
后端响应 枚举code
表里存储 枚举code
内存处理 枚举对象

@Getter
@AllArgsConstructor
@JsonFormat(shape = JsonFormat.Shape.OBJECT)
public enum SexEnum {MALE(0, "男"),FEMALE(1, "女"),UNKNOWN(2, "未知");/*** 前端传递不存在的枚举code,报400错误(起到规范作用)*/@JsonValue  // 告诉jackson 返回json时,使用这个属性@EnumValue  // 告诉mybatis-plus 这个枚举在数据库中保存为这个字段的值private final int code;private final String desc;
}
    /*** 用户性别(0男 1女 2未知)*/@TableField(value = "sex")private SexEnum sex;	// 表里是int类型,实体类字段用枚举类型封装

yml:

mybatis-plus:type-enums-package: com.example.demo.guigu.enums

2. 枚举-mapper.xml

mapper.xml 中,直接使用 枚举对象.code 进行判断

List<SysUser> getEnumeData(@Param("se") SexEnum sexEnum);
<select id="getEnumeData" resultType="com.atguigu.admin.entity.SysUser">select * from sys_user where sex = #{se.code}
</select>

3. 前端丢失大Long精度问题

问题描述:表里的主键如果是大Long,后端用Long包装并返回给前端,前端收到的Long会丢失精度
解决办法:后端统一把Long转成String再返回给前端

// 统一将 Long 类型序列化为 String
@Configuration
public class JacksonConfiguration {@Beanpublic Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {return builder -> {// 把 Long 类型序列化为 Stringbuilder.serializerByType(Long.class, ToStringSerializer.instance);};}
}
@Component
public class LongToStringConverter extends JsonSerializer<Long> {@Overridepublic void serialize(Long aLong, JsonGenerator jsonGenerator,SerializerProvider serializerProvider) throws IOException {jsonGenerator.writeString(aLong.toString());}
}

如若此做,后端响应给前端的json里原本Long类型的字段全变成字符串

讲解视频:https://www.bilibili.com/video/BV1dE421P7y5

http://www.lryc.cn/news/429716.html

相关文章:

  • 【c/c++】 学习ector 容器笔记
  • DN专业3D图形制作软件win/mac软件安装下载(附下载链接)
  • VSCode搭建Hzero(SpringCloud架构)后端开发调试环境
  • 【C++】OJ习题(初阶)
  • 6.4K+ Star!一个强大的本地知识库问答系统,支持多格式文件和跨语言检索,为企业提供高效、安全的数据洞察……
  • mvn编译的时候出现Perhaps you are running on a JRE rather than a JDK 解决方法
  • React原理之Fiber详解
  • 远离“优越感”陷阱,拥抱美好人生
  • Redis的线程模型
  • ubuntu24.04安装nginx1.24
  • 一款好看的WordPress REST API 主题
  • 《5G 与区块链融合:智能城市服务质量的飞跃》
  • 前后端分离开发:用 Apifox 高效管理 API
  • Go Channel 详解
  • 使用FModel提取游戏资产
  • Qt C++ 屏幕录制 保存mp4
  • Adobe After Effects的插件--------CC Cylinder
  • Vue3项目开发——新闻发布管理系统(一)
  • 前端调用后端,出现跨域报错怎么办
  • 使用Node-RED发送数据到巴法云
  • 【今夕是何年】雅达利发布Atari 7800+游戏主机:配备无线手柄、HDMI接口
  • APP支付宝授权获取code uniapp
  • 在Linux系统下安装、配置ETCD
  • lambda 表达式可以传递引用为什么需要引用捕获
  • 【Java】/* 双向链表 - 底层实现 */
  • Go 语言协程管理精解
  • C库函数signal()信号处理
  • 007 SpringCloudAlibaba基础使用(nacos,gateway)
  • 编译环境揭秘
  • 不同的字符集(ASCII、UTF-8、UTF-16/UCS-2、UTF-32/UCS-4)