日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

19位整数 java_为什么阿里巴巴Java开发手册中强制要求超大整数禁止使用Long类型返回?...

發布時間:2025/3/20 java 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 19位整数 java_为什么阿里巴巴Java开发手册中强制要求超大整数禁止使用Long类型返回?... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在閱讀《阿里巴巴Java開發手冊》時,發現有一條關于前后端超大整數返回的規約,具體內容如下:

這個問題在之前和前端聯調的時候發生過,發現根據腳本 id 去審批的時候,狀態沒有變化,后來和前端溝通后,才知道這是 JavaScript 的一個坑,下面來復現下這個錯誤:

錯誤演示

創建一個 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開發手冊》中的對于需要使用超大整數的場景,服務端一律使用 String 字符串類型返回,禁止使用Long 類型出發,提出了幾種解決方法,大家可以根據自己的需求去選擇方法,有其他解決方法的也歡迎留言討論。

最好的關系就是互相成就,大家的點贊、在看、分享、留言就是我創作的最大動力。

總結

以上是生活随笔為你收集整理的19位整数 java_为什么阿里巴巴Java开发手册中强制要求超大整数禁止使用Long类型返回?...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。