众所周知,JAVA中要使用雪花算法生成id,必须将实体类的字段设置为Long类型,对应mysql数据库中的bigint类型。
实体类
数据库
雪花算法的优点有很多,比如跟UUID相比,它是Long类型的,而UUID是字符串类型的,在数据库中明显雪花算法的更美观,UUID更杂乱,并且查询的时候字符串的效率会略低一点
UUID的数据库表
雪花算法的数据库表
重点来了!!!
我在做项目的时候发现,明明在后端从数据库拿到用雪花算法生成的id明明是正确的,但是数据打到前端的时候就全变了,特点是每个id的值全被进位了,为此我专门测试了一下
js代码
控制台输出
再次测试,直接控制台输出
结论是JAVA生成的Long类型数字在JS中被进位了
解决方法
全局配置序列化返回 JSON 处理,将所有向前端输出的Long类型数据转为String类型数据
@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;
}
}
或者对个别字段使用注解JsonFormat方式解决
@TableId(value = "id", type = IdType.ASSIGN_ID)
@JsonFormat(shape = JsonFormat.Shape.STRING)
private Long id;
问题解决,亲测有效
版权声明:本文为qq_27003343原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。