当前位置: 首页 > news >正文

解决Long类型web前端精度丢失问题

1 背景

后端编号采用分布式Id长度19位,如:1564586000854925325,如果直接返回前端Long类型会出现最后1位精度缺失问题,前端接收的数字为:1564586000854925320

2 原因

Java中Long的取值范围:

-9223372036854775808到9223372036854775807(即-2^64“ 到”2^64-1)

JavaScript中的Number取值范围:

-9007199254740992 到9007199254740991 (即-2^53 到2^53-1)

3 解决方法

将Long类型转成String

3.1 spring-boot程序方法1

@Configuration
public class MappingJackson2HttpMessageConverterConfig {

    @Bean
    public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
        MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();

        ObjectMapper objectMapper = new ObjectMapper();
        // 反序列化忽略未知属性
        objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES,false);

        // 全局转化Long类型为String,解决Jackson序列化时web精度确实问题
        SimpleModule simpleModule=new SimpleModule();
        simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
        simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance);
        objectMapper.registerModule(simpleModule);       

        converter.setObjectMapper(objectMapper);
        return converter;
    }
}

3.2 spring-boot程序方法2

@Configuration
public class JacksonConfig {

  /**
   * Jackson全局转化long类型为String,解决long类型缺失精度问题
   *
   * @return Jackson2ObjectMapperBuilderCustomizer 注入的对象
   */
  @Bean
  public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {
    return jacksonObjectMapperBuilder -> jacksonObjectMapperBuilder
        .serializerByType(Long.class, ToStringSerializer.instance)
        .serializerByType(Long.TYPE, ToStringSerializer.instance);
  }
}

相关文章:

  • Docker服务编排
  • 为什么自动化营销对于独立站运营来说很重要?
  • 服务器模型选择
  • 使用Android studio开发一个数独游戏APP 系列第二讲
  • MySQL中的时间类型
  • linux的基础指令
  • Docker容器中安装Mysql和Redis等全过程(以在阿里云服务器中的Docker安装Mysql和Redis为例)
  • java---SPFA算法---判断负权回路(每日一道算法2022.8.31)
  • 操作系统(Linux)
  • 基础 | 并发编程 - [LockSupport]
  • Uboot命令应用
  • kettle-实现不同数据库之间的数据交换
  • OPPO小布4.0:软件定义硬件,智能定义“助手”
  • python获取模块文件路径
  • java计算机毕业设计企业人事管理系统源码+数据库+系统+lw文档+mybatis+运行部署
  • (ckeditor+ckfinder用法)Jquery,js获取ckeditor值
  • Mac 鼠须管 Rime 输入法 安装五笔输入法 教程
  • mysql innodb 索引使用指南
  • nginx 负载服务器优化
  • Sublime Text 2/3 绑定Eclipse快捷键
  • 成为一名优秀的Developer的书单
  • 从0到1:PostCSS 插件开发最佳实践
  • 诡异!React stopPropagation失灵
  • 缓存与缓冲
  • 那些被忽略的 JavaScript 数组方法细节
  • 微信小程序开发问题汇总
  • 一个普通的 5 年iOS开发者的自我总结,以及5年开发经历和感想!
  • 赢得Docker挑战最佳实践
  • 最近的计划
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • ​iOS实时查看App运行日志
  • ​sqlite3 --- SQLite 数据库 DB-API 2.0 接口模块​
  • ​创新驱动,边缘计算领袖:亚马逊云科技海外服务器服务再进化
  • # .NET Framework中使用命名管道进行进程间通信
  • #100天计划# 2013年9月29日
  • $.ajax,axios,fetch三种ajax请求的区别
  • (¥1011)-(一千零一拾一元整)输出
  • (1)(1.13) SiK无线电高级配置(六)
  • (1)(1.8) MSP(MultiWii 串行协议)(4.1 版)
  • (Redis使用系列) Springboot 实现Redis消息的订阅与分布 四
  • (附源码)ssm学生管理系统 毕业设计 141543
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • (牛客腾讯思维编程题)编码编码分组打印下标(java 版本+ C版本)
  • (原創) 如何將struct塞進vector? (C/C++) (STL)
  • (转)ABI是什么
  • (转载)从 Java 代码到 Java 堆
  • (自适应手机端)响应式新闻博客知识类pbootcms网站模板 自媒体运营博客网站源码下载
  • **登录+JWT+异常处理+拦截器+ThreadLocal-开发思想与代码实现**
  • .NET 5种线程安全集合
  • .NET MVC、 WebAPI、 WebService【ws】、NVVM、WCF、Remoting
  • .NET 程序如何获取图片的宽高(框架自带多种方法的不同性能)
  • .NET/C# 编译期能确定的字符串会在字符串暂存池中不会被 GC 垃圾回收掉
  • .NET/C# 项目如何优雅地设置条件编译符号?
  • .Net转Java自学之路—SpringMVC框架篇六(异常处理)
  • @Pointcut 使用