使用雪花算法產生id導致前端精度缺失問題解決方案
一、問題根源
JavaScript的 Number類型安全精度最大為16位(IEEE 754標準),而雪花算法生成的ID通常為18-19位(如1896876827460800512),超出安全范圍導致末2-3位精度丟失,前端則顯示為( 1896876827460800500)。
二、解決方案
1. 全局配置Jackson序列化規(guī)則
通過ObjectMapper將Long類型序列化為String,確保前端接收為字符串類型:
@Bean
public ObjectMapper objectMapper() {
ObjectMapper objectMapper = new ObjectMapper();
SimpleModule module = new SimpleModule();
module.addSerializer(Long.class, ToStringSerializer.instance);
objectMapper.registerModule(module);
return objectMapper;
}●效果:id字段從數字(如1896876827460800512)轉為字符串,如"1896876827460800512"),避免精度丟失 。
2. 實體類必須使用Long封裝類
若實體類字段聲明為基本類型long,Jackson不會觸發(fā)序列化規(guī)則,因為:
●ToStringSerializer僅對Long封裝類生效(long是基本類型,不在處理范圍內)。
●正確聲明方式:private Long id;
3. 檢查其他可能覆蓋配置的因素
●局部注解覆蓋:若某些字段使用了@JsonFormat或@JsonSerialize,需移除或統(tǒng)一配置。
●全局與局部優(yōu)先級:確保自定義ObjectMapper未被其他配置覆蓋(如application.yml中的Jackson配置)。
4. 數據庫與接口文檔調整
●數據庫字段類型:保持BIGINT(雪花ID兼容)。
●接口文檔標注:明確說明id為字符串類型(如Swagger添加@Schema注解),避免前端誤解析為數字。
5. 測試驗證
通過Postman或瀏覽器檢查響應,確認id字段類型已轉為字符串:
{
"id": "1896876827460800512",
"taskId": "1896866728268828672"
}三、擴展建議
前端兼容性:提醒前端避免對
id進行數值運算(如加減),始終以字符串處理。分布式系統(tǒng)一致性:確保所有服務使用相同的序列化配置,避免部分接口返回數字、部分返回字符串。
性能優(yōu)化:若接口性能敏感,可針對特定字段(而非全局)使用
@JsonSerialize(using = ToStringSerializer.class)。
四、總結
通過全局序列化配置 + 實體類使用Long封裝類的組合方案,可徹底解決雪花ID精度丟失問題。
到此這篇關于使用雪花算法產生id導致前端精度缺失問題解決方案的文章就介紹到這了,更多相關前端雪花算法id導致精度缺失內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
javascript下用for( in )語句 獲得所有style 內容的腳本代碼
2008-02-02
uniapp如何使用uv-popup彈出框隱藏底部導航tabbar
文章介紹了如何在uniapp中使用uv-popup組件隱藏底部導航的tabbar,并提供了隱藏前和隱藏后的代碼示例,感興趣的朋友一起看看吧2025-02-02
JavaScript?error瀏覽器端錯誤捕獲處理方法筆記解決示例
這篇文章主要為大家介紹了JavaScript?error瀏覽器端錯誤捕獲處理方法筆記解決示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-06-06

