关于雪花算法的一些坑

众所周知,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版权协议,转载请附上原文出处链接和本声明。