SpringBoot中JSON數(shù)值溢出問題的處理方案
一、問題背景:為什么我的接口突然報(bào)錯(cuò)了?
假設(shè)你正在開發(fā)一個(gè) Spring Boot 接口,接收類似這樣的 JSON 請求:
{
"size": 111111111111111111111
}
然后突然收到用戶的反饋:請求報(bào)錯(cuò)啦!
查看日志,發(fā)現(xiàn)一個(gè)刺眼的異常:
JSON parse error: Numeric value (111111111111111111111) out of range of int
翻譯成“人話”:
前端傳的 size 值太大,后端用 int 類型接收時(shí),超出了 int 的范圍(-2147483648 ~ 2147483647),導(dǎo)致 JSON 解析失敗!
二、為什么會發(fā)生這個(gè)錯(cuò)誤?
1. Java 數(shù)據(jù)類型的“容量”限制
int類型最大只能表示 2147483647。- 當(dāng) JSON 中的數(shù)值超過這個(gè)范圍時(shí),
int裝不下,就會觸發(fā)溢出錯(cuò)誤。
2. 誰在幕后“搞事情”?
- Jackson 庫:Spring Boot 默認(rèn)使用 Jackson 解析 JSON。
當(dāng)字段類型是int或Integer,但 JSON 數(shù)值過大時(shí),Jackson 會直接拋異常!
三、解決方案:三步搞定
第一步:修改字段類型(治本)
直接將 size 的字段類型改為 Long,一步到位解決問題!
public class EsSearchResultRequest {
private Long size; // ? 改為 Long 類型
// 其他字段...
}
為什么有效?
Long的范圍是 -9223372036854775808 ~ 9223372036854775807,足夠容納超大數(shù)值。
第二步:全局異常處理(優(yōu)雅提示)
在 GlobalExceptionHandler 中捕獲異常,返回友好提示:
@ExceptionHandler(HttpMessageNotReadableException.class)
public ResponseEntity<String> handleHttpMessageNotReadable(HttpMessageNotReadableException ex) {
String errorMessage = "請求參數(shù)格式錯(cuò)誤,請檢查數(shù)值范圍";
// 提取具體錯(cuò)誤原因(可選)
if (ex.getCause() instanceof JsonMappingException) {
errorMessage = ex.getCause().getMessage();
}
return ResponseEntity.badRequest().body(errorMessage);
}
效果示例:
前端收到提示:
Numeric value (111111111111111111111) out of range of int
第三步:數(shù)據(jù)校驗(yàn)(防御性編程)
如果業(yè)務(wù)要求 size 必須是較小的數(shù)值,可添加校驗(yàn)邏輯:
public class EsSearchResultRequest {
@Min(value = 1, message = "size 最小為 1")
@Max(value = 1000, message = "size 最大為 1000")
private Long size;
// 其他字段...
}
校驗(yàn)失敗時(shí)提示:
size 最大為 1000
四、擴(kuò)展知識:為什么不用 Integer?
| 類型 | 范圍 | 推薦場景 |
|---|---|---|
| int | -2³¹ ~ 2³¹-1 | 小數(shù)值(如狀態(tài)碼) |
| Long | -2?³ ~ 2?³-1 | 大數(shù)值(如 ID、時(shí)間戳) |
| BigInteger | 無限(內(nèi)存限制) | 天文數(shù)字 |
經(jīng)驗(yàn)法則:
- 不確定數(shù)值大小時(shí),優(yōu)先用
Long。 - 永遠(yuǎn)不要用
int存儲可能超大的值!
五、常見問題 FAQ
1. 前端傳的是字符串,也會報(bào)錯(cuò)嗎?
- 不會!如果 JSON 中
size是字符串"111111111111111111111",需在后端用String類型接收,再手動轉(zhuǎn)換。
2. 數(shù)據(jù)庫字段類型需要改嗎?
- 如果
size要存到數(shù)據(jù)庫(如 MySQL),記得同步修改為BIGINT,否則會插入失??!
3. 為什么異常處理要捕獲 HttpMessageNotReadableException?
- 這是 Spring 在解析請求體失敗時(shí)拋出的“總異常”,涵蓋所有 JSON 解析錯(cuò)誤(如類型不匹配、格式錯(cuò)誤等)。
六、總結(jié):避坑指南
- 設(shè)計(jì)階段:根據(jù)業(yè)務(wù)場景選擇合適的數(shù)據(jù)類型。
- 不確定時(shí),無腦用
Long!
- 不確定時(shí),無腦用
- 編碼階段:
- 添加數(shù)據(jù)校驗(yàn)(如
@Min、@Max)。 - 全局異常處理,返回友好提示。
- 添加數(shù)據(jù)校驗(yàn)(如
- 協(xié)作階段:
- 告知前端參數(shù)范圍和格式要求。
- 更新接口文檔,明確
size的類型和限制。
到此這篇關(guān)于SpringBoot中JSON數(shù)值溢出問題的處理方案的文章就介紹到這了,更多相關(guān)SpringBoot JSON數(shù)值溢出內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用Jackson進(jìn)行JSON生成與解析的新手指南
這篇文章主要為大家詳細(xì)介紹了如何使用Jackson進(jìn)行JSON生成與解析處理,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-04-04
Spring Boot 3.4.0 結(jié)合 Mybatis-plus 實(shí)
本文詳細(xì)介紹了在 Spring Boot 3.4.0 項(xiàng)目中結(jié)合 Mybatis-plus 實(shí)現(xiàn)動態(tài)數(shù)據(jù)源切換的完整方案,通過自定義注解和AOP切面,我們可以優(yōu)雅地實(shí)現(xiàn)方法級別的數(shù)據(jù)源切換,滿足多數(shù)據(jù)源場景下的各種需求,感興趣的朋友一起看看吧2025-04-04
詳解java 中Spring jsonp 跨域請求的實(shí)例
這篇文章主要介紹了詳解java 中Spring jsonp 跨域請求的實(shí)例的相關(guān)資料,jsonp 可用于解決主流瀏覽器的跨域數(shù)據(jù)訪問的問題,需要的朋友可以參考下2017-08-08
解析Spring RestTemplate必須搭配MultiValueMap的理由
本文給大家介紹Spring RestTemplate必須搭配MultiValueMap的理由,本文通過實(shí)例圖文相結(jié)合給大家介紹的非常詳細(xì),需要的朋友參考下吧2021-11-11
Java:DocumentBuilderFactory調(diào)用XML的方法實(shí)例
Java:DocumentBuilderFactory調(diào)用XML的方法實(shí)例,需要的朋友可以參考一下2013-04-04
Java 17 更新后的 strictfp 關(guān)鍵字
strictfp 可能是最沒有存在感的關(guān)鍵字了,很多人寫了多年 Java 甚至都不知道它的存在,strictfp,字面意思就是嚴(yán)格的浮點(diǎn)型。這玩意兒居然還有個(gè)關(guān)鍵字,可見其地位還是很高的。下面文章小編就帶大家詳細(xì)介紹其關(guān)鍵字,需要的朋友可以參考一下2021-09-09
Java中this和super的區(qū)別及this能否調(diào)用到父類使用
這篇文章主要介紹了Java中this和super的區(qū)別及this能否調(diào)用到父類使用,this和super都是Java中常見的關(guān)鍵字,下文關(guān)于兩者區(qū)別介紹,需要的小伙伴可以參考一下2022-05-05

