SpringBoot返回前端Long类型字段丢失精度问题及解决方案

 更新时间:2024年03月12日 08:23:59   作者:凡~同学  
Java服务端返回Long整型数据给前端,JS会自动转换为Number类型,本文主要介绍了SpringBoot返回前端Long类型字段丢失精度问题及解决方案,感兴趣的可以了解一下

一、问题分析

Java服务端返回Long整型数据给前端,JS会自动转换为Number类型。而Long类型能表示的最大值为(2^{63}-1),当数值超过JS中Number类型的最大值(2^{53})时,就会丢失精度。

二、解决方案

1、返回给前端的属性类型设为String类型。

2、配置Jackson序列化

首先,引入依赖。

<dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
             <artifactId>jackson-databind</artifactId>
      <version>2.12.1</version>
</dependency>
<dependency>
       <groupId>com.fasterxml.jackson.dataformat</groupId>
             <artifactId>jackson-dataformat-xml</artifactId>
       <version>2.12.1</version>
</dependency>

新建一个自定义大数据序列化类,如下:

@Slf4j
@Configuration
public class JacksonConfig {

    @Bean
    public Jackson2ObjectMapperBuilderCustomizer customizer() {
        return builder -> {
            // 全局配置序列化返回 JSON 处理
            JavaTimeModule javaTimeModule = new JavaTimeModule();
            javaTimeModule.addSerializer(Long.class, BigNumberSerializer.INSTANCE);
            javaTimeModule.addSerializer(Long.TYPE, BigNumberSerializer.INSTANCE);
            javaTimeModule.addSerializer(BigInteger.class, BigNumberSerializer.INSTANCE);
            javaTimeModule.addSerializer(BigDecimal.class, ToStringSerializer.instance);
            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
            javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(formatter));
            javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(formatter));
            builder.modules(javaTimeModule);
            builder.timeZone(TimeZone.getDefault());
            log.info("初始化 jackson 配置");
        };
    }
}

新建Jackson配置类

@Slf4j
@Configuration
public class JacksonConfig {

    @Bean
    public Jackson2ObjectMapperBuilderCustomizer customizer() {
        return builder -> {
            // 全局配置序列化返回 JSON 处理
            JavaTimeModule javaTimeModule = new JavaTimeModule();
            javaTimeModule.addSerializer(Long.class, BigNumberSerializer.INSTANCE);
            javaTimeModule.addSerializer(Long.TYPE, BigNumberSerializer.INSTANCE);
            javaTimeModule.addSerializer(BigInteger.class, BigNumberSerializer.INSTANCE);
            javaTimeModule.addSerializer(BigDecimal.class, ToStringSerializer.instance);
            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
            javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(formatter));
            javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(formatter));
            builder.modules(javaTimeModule);
            builder.timeZone(TimeZone.getDefault());
            log.info("初始化 jackson 配置");
        };
    }
}

三、总结

本文针对Java服务端返回Long整型数据给前端时精度丢失问题,提出了两种解决方案,大家根据自己的需求选择食用

到此这篇关于SpringBoot返回前端Long类型字段丢失精度问题及解决方案的文章就介绍到这了,更多相关SpringBoot返回Long丢失精度内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Spring Boot修改启动端口的方法

    Spring Boot修改启动端口的方法

    下面小编就为大家带来一篇Spring Boot修改启动端口的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-07-07
  • java获取鼠标在屏幕上坐标的方法

    java获取鼠标在屏幕上坐标的方法

    本文介绍的是如何用java获取鼠标在屏幕上的坐标,这个功能其实没什么难度可言,在这里分享给大家,是因为有时候我们需要这个工具,Java作为跨平台语言的优势在这个软件就可以体现出来,不需修改就可以在windows、mac、Linux上使用这个软件。下面来一起看看详细的介绍吧。
    2016-12-12
  • Springboot2.6.x的启动流程与自动配置详解

    Springboot2.6.x的启动流程与自动配置详解

    这篇文章主要给大家介绍了关于Springboot2.6.x的启动流程与自动配置的相关资料,文中通过实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2022-01-01
  • Java里得到00:00:00格式的时分秒的Timestamp

    Java里得到00:00:00格式的时分秒的Timestamp

    Java里如何得到00:00:00格式的时分秒的Timestamp ,下面是具体的实现代码,需要的朋友可以参考下。
    2009-09-09
  • 剖析SpringCloud Feign中所隐藏的坑

    剖析SpringCloud Feign中所隐藏的坑

    这篇文章主要为大家介绍了剖析SpringCloud Feign中所隐藏的坑示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • Java Swagger技术使用指南

    Java Swagger技术使用指南

    Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。总体目标是使客户端和文件系统作为服务器以同样的速度来更新。文件的方法,参数和模型紧密集成到服务器端的代码,允许API来始终保持同步
    2021-09-09
  • Java实现身份证号码验证源码示例分享

    Java实现身份证号码验证源码示例分享

    本篇文章主要介绍了Java实现身份证号码验证源码示例分享,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • Netty 拆包沾包问题解决方案详解

    Netty 拆包沾包问题解决方案详解

    这篇文章主要为大家介绍了Netty 拆包沾包问题解决方案示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • java中获取hashmap中的所有key方式

    java中获取hashmap中的所有key方式

    这篇文章主要介绍了java中获取hashmap中的所有key方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • Java多线程继承Thread类详解

    Java多线程继承Thread类详解

    Java多线程的两种实现方式:继承Thread类 & 实现Runable接口,今天我们来学习下继承Thread类,希望大家能够喜欢
    2016-06-06

最新评论