为什么Java中要求超大整数禁止使用Long类型返回

技术为什么Java中要求超大整数禁止使用Long类型返回本篇内容主要讲解“为什么Java中要求超大整数禁止使用Long类型返回”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“为

本文主要讲解“为什么Java中要求非常大的整数禁止用Long类型返回”,感兴趣的朋友不妨看一下。本文介绍的方法简单、快速、实用。让带你去学习“为什么Java里要求很大的整数禁止用Long类型返回”!

错误演示

您可以通过创建一个Spring Boot项目,然后创建一个新的接口来返回DbScript对象,其中id是由mybatis-plus的IdWorker.getId(基于雪花算法)生成的19位长的数值。

@ rest controller @ request mapping('/dbscript ')public classdbscriptcontroller { logger=logger factory . getlogger(dbscriptcontroller . class);@ request mapping('/info ')publidbscriptgetdbscript(){ DbScriptdbScript=new dbscript();//给出一个大整数长的脚本idlongid=idworker . getid();dbscript . SetID(id);logger.info('id:{} ',id);returndbScript}}然后启动服务,访问浏览器上的界面。结果如下:

为什么Java中要求超大整数禁止使用Long类型返回

从日志中可以看到,后端发送给前端的id是1304270071757017088,而前端得到的是1304270071757017000,其中出现了精度损失。

为什么会这样?

通过开发手册可以知道,如果返回值超过2的53次方,就会转换成JS Number,此时有些值可能会失去精度。

解决方法

如果发生这种情况,我们如何解决?

不要慌,可以采取以下方法:

如果此对象仅在此方法中使用,则可以直接将属性从Long类型更改为String类型。

如果此对象在许多地方使用,您可以在序列化期间将Long类型转换为String类型。

还可以添加一个String类型的新属性,专门用来在前端和后端传输这个大整数。

第一种方法

第一种方法比较简单,龙id直接;更改为字符串id;这仅适用于该对象,并且仅在该方法中使用,这是相当有限的。

第二种方法

在第二种方法中,可以向属性添加注释。如果使用Jackson,则可以添加诸如@ JSON format(shape=JSON format . shape . string)或@ jsonserialize(使用=tostringserializer.class)之类的注释。

如果有很多情况需要修改,一个一个添加还是有点麻烦,那么有什么好的方法吗?

如果使用Jackson,它有一个配置参数WRITE_NUMBERS_AS_STRINGS,可以强制将所有数字转换为字符串进行输出。使用方法非常简单,只需要配置参数:spring . Jackson . generator . write _ numbers _ as _ strings=true。这种方法的优点是使用方便,不需要调整代码。缺点是粒度太大,所有的数字都输出为字符串,包括按照时间戳格式输出的时间。

那么,还有什么方法只能处理Long类型并转换成String类型呢?

Jackson提供了这种支持,并且可以自定义对象映射器。具体代码如下:

public class jacksonconfiguration { @ BeanPublicJackon2 ObjectMapPerBuilder customizer jackon2 ObjectMapPerBuilder customizer(){ returnJackOnObjectMapPerBuilder-JackOnObjectMapPerBuilder . SerializerBytype(Long . class,ToStringSerializer.instance)。serializerByType(长。类型,tostringserializer . instance);}}通过定义Jackson2ObjectMapperBuilder,定制jackson2 objectmapperbuilder对象,定制Long数据,使用ToStringSerializer进行序列化。

第三种方法

第三种方法需要一个额外的属性,例如使用String dbScripId来替换以前的Id。

至此,相信大家对“为什么Java中要求非常大的整数禁止用Long类型返回”有了更深的理解,下面我们来做一些实际的工作!这是网站。更多相关内容,可以进入相关渠道查询,关注我们,继续学习!

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/53881.html

(0)

相关推荐

  • iOS如何实现应用退出场景

    技术iOS如何实现应用退出场景这篇文章主要介绍了iOS如何实现应用退出场景,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。场景描述:应用处于运行状态(即Ac

    攻略 2021年10月21日
  • 仙宗十友,宋之问是武则天的朋友吗

    技术仙宗十友,宋之问是武则天的朋友吗宋之问(约656年-约712年)仙宗十友,字延清,名少连,唐汾州隰城人(今山西汾阳市)人,一说虢州弘农(今河南灵宝)人,初唐时期的诗人,与沈佺期并称“沈宋”,仙宗十友之一。
    唐高宗上元

    生活 2021年10月19日
  • Linux权限位介绍

    技术Linux权限位介绍 Linux权限位介绍Linux 系统,最常见的文件权限有 3 种,即对文件的读(用 r 表示)、写(用 w 表示)和执行(用 x 表示,针对可执行文件或目录)权限。在 Linu

    礼包 2021年12月7日
  • 如何使用VarifocalNet制定候选框排序的最佳方案

    技术如何用VarifocalNet进行对候选框排序的最优方案今天就跟大家聊聊有关如何用VarifocalNet进行对候选框排序的最优方案,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这

    攻略 2021年12月23日
  • 如何使用mafft进行多序列比对

    技术如何使用mafft进行多序列比对这篇文章给大家介绍如何使用mafft进行多序列比对,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。对于几千条序列的多序列比对,无论是从准确度还是运行速度上考虑,mu

    攻略 2021年11月10日
  • 安时,拜安时的操作方法是怎样的

    技术安时,拜安时的操作方法是怎样的1.准备。检查试剂盒和监测仪的批号确保一致安时,同时要保证试剂盒在室温下放置至少1小时。  2.采血。用采血器采指尖血约5μl,正好填满采血器,避免过多或过少。  3.制样。将采血器完全

    生活 2021年10月19日