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丢失精度内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 细品Java8中hashCode方法的使用

    细品Java8中hashCode方法的使用

    这篇文章主要介绍了细品Java8中hashCode方法的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • 怎么在AVD上安装apk软件

    怎么在AVD上安装apk软件

    执行 Windows 开始菜单 => 所有程序 => 附件 => 命令提示符 或通过 Win+R 组合键调出 运行 对话框输入cmd 单击确定即可
    2013-09-09
  • Spring MVC异常处理机制示例详解

    Spring MVC异常处理机制示例详解

    这篇文章主要给大家介绍了关于Spring MVC异常处理机制的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Spring MVC具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-11-11
  • Java负载均衡服务器实现上传文件同步

    Java负载均衡服务器实现上传文件同步

    这篇文章主要介绍了Java负载均衡服务器实现上传文件同步,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • mybatis的dtd约束文件及配置文件xml自动提示操作

    mybatis的dtd约束文件及配置文件xml自动提示操作

    这篇文章主要介绍了mybatis的dtd约束文件及配置文件xml自动提示操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • Java实现鼠标随机移动效果的示例代码

    Java实现鼠标随机移动效果的示例代码

    有的时候我们需要鼠标一直滑动的情况,为了节省时间,本文用Java语言写了一个脚本,可以实现鼠标随机移动,感兴趣的小伙伴可以了解一下
    2022-05-05
  • Java 多线程并发ReentrantLock

    Java 多线程并发ReentrantLock

    这篇文章主要介绍了Java 多线程并发ReentrantLock,Java 提供了 ReentrantLock 可重入锁来提供更丰富的能力和灵活性,感兴趣的小伙伴可以参考一下
    2022-06-06
  • Java通过MyBatis框架对MySQL数据进行增删查改的基本方法

    Java通过MyBatis框架对MySQL数据进行增删查改的基本方法

    MyBatis框架由Java的JDBC API进一步封装而来,在操作数据库方面效果拔群,接下来我们就一起来看看Java通过MyBatis框架对MySQL数据进行增删查改的基本方法:
    2016-06-06
  • mybatis解决<foreach>标签不能超过1000的问题

    mybatis解决<foreach>标签不能超过1000的问题

    MyBatis是一个开源的持久层框架,它可以帮助开发者简化数据库操作的编写,而foreach是MyBatis中的一个重要标签,用于在SQL语句中进行循环操作,本文主要给大家介绍了mybatis解决<foreach>标签不能超过1000的问题,需要的朋友可以参考下
    2024-05-05
  • 使用Java调用Yolo模型的基本步骤

    使用Java调用Yolo模型的基本步骤

    Yolo(You Only Look Once)是一种基于深度学习的目标检测算法,它可以在一张图像中同时检测出多个目标,并给出它们的位置和类别,这篇文章主要介绍了使用Java调用Yolo模型的基本步骤,需要的朋友可以参考下
    2024-03-03

最新评论