关于解决雪花算法生成的ID传输前端后精度丢失问题

 更新时间:2023年03月29日 16:05:04   作者:白日日白  
这篇文章主要介绍了关于解决雪花算法生成的ID传输前端后精度丢失问题,雪花算法生成的ID传输到前端时,会出现后三位精度丢失,本文提供了解决思路,需要的朋友可以参考下

 一、问题描述 

在用雪花算法生成的ID传输到前端时,会出现后三位精度丢失

8c21f91d605543db9dec9f11bc9aa145.png

可以看到,我们得到的response为1594605819398193154

而前端展示的为1594605819398193200

这是因为JS是弱语言,前端接收数字类型参数为number

最大接收长度为16位,超出长度则会丢失精度

而JAVA的Long类型长度为19位,所以传输到前端的后三位精度丢失

所以我们解决该问题的思路就是:把java里的Long类型转换为String返回给前端

二、解决方案

2.1、修改数据库字段

可以把数据库的ID字段从Long改为varchar,不过不建议这样做,这样修改后查询无法走索引,降低了效率

2.2、配置MVC全局消息转换器

我们可以在springmvc的配置类中(也就是继承了WebMvcConfigurationSupport接口的那个配置类)重写extendMessageConverters方法

8bddcf9932784c379205d2e3a1d34a65.png

d7f8592e1ed54415ab70aa06e024f3a3.png

    /**
     * 扩展mvc框架的消息转换器
     * @param converters
     */
    @SneakyThrows
    @Override
    protected void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
        //创建消息转换器对象
        MappingJackson2HttpMessageConverter messageConverter=new MappingJackson2HttpMessageConverter();
        //设置对象转换器,底层使用Jackson将Java对象转为json
        messageConverter.setObjectMapper(new JacksonObjectMapper());
        //将上面的消息转换器对象追加到mvc框架的转换器集合中
        converters.add(0,messageConverter);
    }

编写一个JacksonObjectMapper类

12d0758fcc274b14bc2bc12efc6c0063.png

/**
 * 对象映射器:基于jackson将Java对象转为json,或者将json转为Java对象
 * 将JSON解析为Java对象的过程称为 [从JSON反序列化Java对象]
 * 从Java对象生成JSON的过程称为 [序列化Java对象到JSON]
 */
public class JacksonObjectMapper extends ObjectMapper {
 
    public static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd";
    public static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
    public static final String DEFAULT_TIME_FORMAT = "HH:mm:ss";
 
    public JacksonObjectMapper() throws NoSuchFieldException {
        SimpleModule simpleModule = new SimpleModule()
                .addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT)))
                .addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT)))
                .addDeserializer(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT)))
 
                .addSerializer(BigInteger.class, ToStringSerializer.instance)
                .addSerializer(Long.class, ToStringSerializer.instance)
                .addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT)))
                .addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT)))
                .addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT)));
 
        //注册功能模块 例如,可以添加自定义序列化器和反序列化器
        this.registerModule(simpleModule);
    }
}

注意:该方法是将所有Long类型都序列化成String的《全局转换》 

2.3、修改Result类型

我这边封装了一个Result类,可以直接用String.valueOf去把Long类型的id转换成String

a7d00095babc4944ade42d9c42e9670f.png

也可以在Result类里多加一个判断

ab80b44c8f994b0a9c41784e199973e3.png

到此这篇关于关于解决雪花算法生成的ID传输前端后精度丢失问题的文章就介绍到这了,更多相关雪花算法的ID传输精度丢失内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解SpringCloud Zuul过滤器返回值拦截

    详解SpringCloud Zuul过滤器返回值拦截

    Zuul作为网关服务,是其他各服务对外中转站,通过Zuul进行请求转发。这篇文章主要介绍了详解SpringCloud Zuul过滤器返回值拦截,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-06-06
  • JCommander解析命令行参数使用详解

    JCommander解析命令行参数使用详解

    这篇文章主要为大家介绍了JCommander解析命令行参数使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • springboot项目中jacoco服务端部署使用

    springboot项目中jacoco服务端部署使用

    这篇文章主要为大家介绍了springboot项目中jacoco服务端部署使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • 使用Prometheus监控Tomcat等java应用的状态

    使用Prometheus监控Tomcat等java应用的状态

    本文介绍了如何配置Tomcat监控,使用JMX Exporter和Prometheus进行监控,并通过Grafana展示监控数据
    2024-12-12
  • java中的4种循环方法示例详情

    java中的4种循环方法示例详情

    大家好,本篇文章主要讲的是java中的4种循环方法示例详情,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2021-12-12
  • Spring+SpringMVC+MyBatis深入学习及搭建(三)之MyBatis全局配置文件解析

    Spring+SpringMVC+MyBatis深入学习及搭建(三)之MyBatis全局配置文件解析

    这篇文章主要介绍了Spring+SpringMVC+MyBatis深入学习及搭建(三)之MyBatis全局配置文件解析,需要的朋友可以参考下
    2017-05-05
  • 详解Spring Boot 事务的使用

    详解Spring Boot 事务的使用

    spring Boot 使用事务非常简单,首先使用注解 @EnableTransactionManagement 开启事务支持后,然后在访问数据库的Service方法上添加注解 @Transactional 便可。接下来通过本文重点给大家介绍spring boot事务的使用,需要的的朋友参考下吧
    2017-04-04
  • Java泛型extends及super区别实例解析

    Java泛型extends及super区别实例解析

    这篇文章主要介绍了Java泛型extends及super区别实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • 使用@Validated和@Valid 解决list校验的问题

    使用@Validated和@Valid 解决list校验的问题

    这篇文章主要介绍了使用@Validated和@Valid 解决list校验的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • 一文详解Redisson分布式锁底层实现原理

    一文详解Redisson分布式锁底层实现原理

    这篇文章主要详细介绍了Redisson分布式锁底层实现原理,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-07-07

最新评论