千家信息网

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

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,本篇内容主要讲解"为什么Java中要求超大整数禁止使用Long类型返回",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"为什么Java中要求超大整数禁止使用L
千家信息网最后更新 2026年10月31日为什么Java中要求超大整数禁止使用Long类型返回

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

错误演示

创建一个 Spring Boot 项目,然后在新建一个接口,可以返回 DbScript 对象,其中 id 是由 mybatis-plus 的 IdWorker.getId(基于 Snowflake 算法)生成的 19 位 long 类型的数值。

@RestController @RequestMapping("/dbScrip") public class DbScriptController {     Logger logger = LoggerFactory.getLogger(DbScriptController.class);      @RequestMapping("/info")     public DbScript getDbScript() {         DbScript dbScript = new DbScript();         // 赋予一个大整数 long 型脚本 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,可以添加 @JsonFormat(shape = JsonFormat.Shape.STRING) 或者 @JsonSerialize(using = ToStringSerializer.class) 注解。

如果这种需要修改的情况比较多,那么逐个添加还是有点费事,那么还有什么好办法吗?

如果使用的是Jackson,它有个配置参数 WRITE_NUMBERS_AS_STRINGS,可以强制将所有数字全部转成字符串输出,使用方法很简单,只需要配置参数即可:spring.jackson.generator.write_numbers_as_strings=true,这种方式的优点是使用方便,不需要调整代码;缺点是颗粒度太大,所有的数字都被转成字符串输出了,包括按照 timestamp 格式输出的时间也是如此。

那么还有什么方法能够只对 Long 类型进行处理转换成 String 类型呢?

Jackson 提供了这种支持,可以对 ObjectMapper 进行定制,具体代码如下所示:

public class JacksonConfiguration {      @Bean     public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {         return jacksonObjectMapperBuilder -> jacksonObjectMapperBuilder                 .serializerByType(Long.class, ToStringSerializer.instance)                 .serializerByType(Long.TYPE, ToStringSerializer.instance);     } }

通过定义 Jackson2ObjectMapperBuilderCustomizer,对 Jackson2ObjectMapperBuilder 对象进行定制,对 Long 型数据进行了定制,使用ToStringSerializer来进行序列化。

第三种方法

第三种方法就需要多一个属性,比如使用String dbScripId,用来代替之前的 id。

到此,相信大家对"为什么Java中要求超大整数禁止使用Long类型返回"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

方法 类型 整数 对象 属性 情况 数值 输出 代码 内容 前端 参数 字符 字符串 序列 损失 接口 数字 注解 精度 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技有限公司 互联网科技工作委员会毛军 深圳恒合互联网络科技有限公司 互联网科技保险 互联网科技金融公司 合肥互联网科技公司 撒么互联网科技公司 海南科技产业互联网平台 玖二柒互联网科技公司待遇 济南华为互联网科技产业总部基地 新华互联网科技2019 互联网科技有哪些公司 互联网科技公司有风险吗 徐州市互联网科技有限公司 互联网公司高科技产品 浙南科技城互联网大厦招聘 宁波跨境商互联网科技有限公司 湖北辰鑫科技互联网 安徽九吞吴互联网科技有限公司 如何强化互联网金融科技 科技互联网企业 科技信息互联网 互联网科技战争 移动互联网科技股 金融科技与互联网金融相同和不同 工业互联网山东科技大学 江苏苏星互联网科技有限公司 互联网风格科技公司名称 昆明中奇联合互联网科技 互联网科技快速发展优美句子
0