热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

前后对接数字几_前后端超大整数传输会有精度损失?看看阿里怎么做

在阅读《阿里巴巴Java开发手册》时,发现有一条关于前后端超大整数返回的规约,这是JavaScript的一个坑:首先我们创建一个Sprin

在阅读《阿里巴巴Java开发手册》时,发现有一条关于前后端超大整数返回的规约,这是Javascript 的一个坑:

12a7096d5fee430b41304f80e2405d63.png

首先我们创建一个Spring Boot项目,然后再新建接口用来返回DbScript对象,其中的id是由mybatis-plus的IdWorker.getld生成的19位long类型的数值。

@RestController @RequestMapping("/dbScrip") public class DbScriptController { Logger logger = LoggerFactory.getLogger(DbScriptController.class); @RequestMapping("/info") public DbScript getDbScript() { DbScript dbScript = new DbScript(); // id long id = IdWorker.getId(); dbScript.setId(id); logger.info("id:{}", id); return dbScript; } }

然后将服务启动,通过浏览器对接口进行访问我们可以发现,通过日志可以看到后端传给前端的id是不同的,在这个传递的过程中产生了损失,后端传的是1304270071757017088但是前端接收的却是1304270071757017000。

我们通过开发手册来查询原因就会了解到,如果返回的数值大于2的53次方,那么就会转换成JS的Number,这些数值就可能在传输的过程中发生精度的损失。

解决方法

针对这项问题,可以采取如下的几种方法

如果这个对象只在这个方法中用到了,可以将该属性直接从Long变为String型。如果这个对象在很多地方都使用了,那么在序列化的过程中,将Long类型转换成String类型。我们也可以通过添加一个新的String属性来处理前后端对于大整数的传输。

方法一:

直接将Long id改成String id;这种方法相对来说比较局限,仅适用于对象只在这个方法中使用。

方法二:

还可以在属性上增加注解。这种方法也是有弊端存在的,如果需要修改的部分比较多,那么逐个添加的工作量还是比较大的,假设使用的是Jackson,那么可以通过WRITE_NUMBERS_AS_STRINGS这个配置参数将所有数字全部转换成字符串强制输出,方法使用也比较简单,优点在于使用方便,几乎不需要调整代码。但是这样做的问题在于颗粒度较大, 将所有的数字都转换成字符串输出后,按照 timestamp 格式输出的时间也会是这样。

方法三:

可以用一个多的属性,例如使用String dbScripId来代替之前的id。

总结

本文针对《阿里巴巴Java开发手册》中的对于需要使用超大整数的场景,服务端一律使用 String 字符串类型返回,禁止使用Long 类型出发,提出了几种解决方法,大家可以根据自己的需求去选择方法。



推荐阅读
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • Java实战之电影在线观看系统的实现
    本文介绍了Java实战之电影在线观看系统的实现过程。首先对项目进行了简述,然后展示了系统的效果图。接着介绍了系统的核心代码,包括后台用户管理控制器、电影管理控制器和前台电影控制器。最后对项目的环境配置和使用的技术进行了说明,包括JSP、Spring、SpringMVC、MyBatis、html、css、JavaScript、JQuery、Ajax、layui和maven等。 ... [详细]
  • 微信官方授权及获取OpenId的方法,服务器通过SpringBoot实现
    主要步骤:前端获取到code(wx.login),传入服务器服务器通过参数AppID和AppSecret访问官方接口,获取到OpenId ... [详细]
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • 本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • springmvc学习笔记(十):控制器业务方法中通过注解实现封装Javabean接收表单提交的数据
    本文介绍了在springmvc学习笔记系列的第十篇中,控制器的业务方法中如何通过注解实现封装Javabean来接收表单提交的数据。同时还讨论了当有多个注册表单且字段完全相同时,如何将其交给同一个控制器处理。 ... [详细]
  • 开发笔记:Java是如何读取和写入浏览器Cookies的
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Java是如何读取和写入浏览器Cookies的相关的知识,希望对你有一定的参考价值。首先我 ... [详细]
  • 本文介绍了django中视图函数的使用方法,包括如何接收Web请求并返回Web响应,以及如何处理GET请求和POST请求。同时还介绍了urls.py和views.py文件的配置方式。 ... [详细]
  • 在springmvc框架中,前台ajax调用方法,对图片批量下载,如何弹出提示保存位置选框?Controller方法 ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
  • Servlet多用户登录时HttpSession会话信息覆盖问题的解决方案
    本文讨论了在Servlet多用户登录时可能出现的HttpSession会话信息覆盖问题,并提供了解决方案。通过分析JSESSIONID的作用机制和编码方式,我们可以得出每个HttpSession对象都是通过客户端发送的唯一JSESSIONID来识别的,因此无需担心会话信息被覆盖的问题。需要注意的是,本文讨论的是多个客户端级别上的多用户登录,而非同一个浏览器级别上的多用户登录。 ... [详细]
  • Java如何导入和导出Excel文件的方法和步骤详解
    本文详细介绍了在SpringBoot中使用Java导入和导出Excel文件的方法和步骤,包括添加操作Excel的依赖、自定义注解等。文章还提供了示例代码,并将代码上传至GitHub供访问。 ... [详细]
  • 开发笔记:spring boot项目打成war包部署到服务器的步骤与注意事项
    本文介绍了将spring boot项目打成war包并部署到服务器的步骤与注意事项。通过本文的学习,读者可以了解到如何将spring boot项目打包成war包,并成功地部署到服务器上。 ... [详细]
  • Spring框架《一》简介
    Spring框架《一》1.Spring概述1.1简介1.2Spring模板二、IOC容器和Bean1.IOC和DI简介2.三种通过类型获取bean3.给bean的属性赋值3.1依赖 ... [详细]
author-avatar
手机用户2502933251
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有