MP生成19位数字型id,js处理过程中精度损失
问题提出
MybatisPlus主键生成策略,有以下几种
ID_WORKER 自动生成19位值,数字类型用这种策略,比如Long
ID_WORKER_STR 自动生成19位值,字符串类型用这种策略
AUTO ID自动增长
INPUT 用户设置ID值
NONE 未设置主键类型
UUID UUID类型的主键,生成随机唯一值
当使用ID_WORKER 策略后,传给前端。当前端将这个长度超出自己处理范围(自己仅能处理16位的)的19位id向后台传的过程中,会发生精度丢失。⽐如数据库⾥的ID为1044297632316526592,传到前端就变成1044297632316526600。
前端JSON字符串转js对象,接收Long类型的是Number,Number精度是16位(雪花ID是19位),JS的Number数据类型导致精度丢失。
问题解决
解决办法一:主键使用ID_WORKER_STR 生成策略
@TableId(value = "student_id", type = IdType.ID_WORKER)
private long studentId;
解决办法二:@JsonSerialize注解
public class Post{
@JsonSerialize(using = ToStringSerializer.class)
private Long studentId;
...
}
解决办法三:全局配置
@Configuration
@EnableWebMvc
public class WebMvcConfig implements WebMvcConfigurer {
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
MappingJackson2HttpMessageConverter jackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();
ObjectMapper objectMapper = new ObjectMapper();
// 全局配置序列化返回 JSON 处理
SimpleModule simpleModule = new SimpleModule();
// JSON Long ==> String 将所有的 Long类型 转换成 String类型 返回
simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
objectMapper.registerModule(simpleModule);
jackson2HttpMessageConverter.setObjectMapper(objectMapper);
converters.add(jackson2HttpMessageConverter);
}
}