Spring?Boot中JSON數(shù)值溢出問題從報錯到優(yōu)雅解決辦法
一、問題背景:為什么我的接口突然報錯了?
假設你正在開發(fā)一個 Spring Boot 接口,接收類似這樣的 JSON 請求:
{ "size": 111111111111111111111 }
然后突然收到用戶的反饋:請求報錯啦!查看日志,發(fā)現(xiàn)一個刺眼的異常:
JSON parse error: Numeric value (111111111111111111111) out of range of int
翻譯成“人話”:前端傳的 size
值太大,后端用 int
類型接收時,超出了 int
的范圍(-2147483648 ~ 2147483647),導致 JSON 解析失?。?/p>
二、為什么會發(fā)生這個錯誤?
1. Java 數(shù)據(jù)類型的“容量”限制
int
類型最大只能表示 2147483647。- 當 JSON 中的數(shù)值超過這個范圍時,
int
裝不下,就會觸發(fā)溢出錯誤。
2. 誰在幕后“搞事情”?
- Jackson 庫:Spring Boot 默認使用 Jackson 解析 JSON。
當字段類型是int
或Integer
,但 JSON 數(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ù)格式錯誤,請檢查數(shù)值范圍"; // 提取具體錯誤原因(可選) 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è)務要求 size
必須是較小的數(shù)值,可添加校驗邏輯:
public class EsSearchResultRequest { @Min(value = 1, message = "size 最小為 1") @Max(value = 1000, message = "size 最大為 1000") private Long size; // 其他字段... }
校驗失敗時提示:
size 最大為 1000
四、擴展知識:為什么不用 Integer?
類型 | 范圍 | 推薦場景 |
---|---|---|
int | -2³¹ ~ 2³¹-1 | 小數(shù)值(如狀態(tài)碼) |
Long | -2?³ ~ 2?³-1 | 大數(shù)值(如 ID、時間戳) |
BigInteger | 無限(內存限制) | 天文數(shù)字 |
經驗法則:
- 不確定數(shù)值大小時,優(yōu)先用
Long
。 - 永遠不要用
int
存儲可能超大的值!
五、常見問題 FAQ
1. 前端傳的是字符串,也會報錯嗎?
- 不會!如果 JSON 中
size
是字符串"111111111111111111111"
,需在后端用String
類型接收,再手動轉換。
2. 數(shù)據(jù)庫字段類型需要改嗎?
- 如果
size
要存到數(shù)據(jù)庫(如 MySQL),記得同步修改為BIGINT
,否則會插入失??!
3. 為什么異常處理要捕獲 HttpMessageNotReadableException?
- 這是 Spring 在解析請求體失敗時拋出的“總異常”,涵蓋所有 JSON 解析錯誤(如類型不匹配、格式錯誤等)。
六、總結:避坑指南
- 設計階段:根據(jù)業(yè)務場景選擇合適的數(shù)據(jù)類型。
- 不確定時,無腦用
Long
!
- 不確定時,無腦用
- 編碼階段:
- 添加數(shù)據(jù)校驗(如
@Min
、@Max
)。 - 全局異常處理,返回友好提示。
- 添加數(shù)據(jù)校驗(如
- 協(xié)作階段:
- 告知前端參數(shù)范圍和格式要求。
- 更新接口文檔,明確
size
的類型和限制。
到此這篇關于Spring Boot中JSON數(shù)值溢出問題從報錯到優(yōu)雅解決辦法的文章就介紹到這了,更多相關SpringBoot JSON數(shù)值溢出問題內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
關于eclipse中運行tomcat提示端口被占用的4種解決
這篇文章主要介紹了關于eclipse中運行tomcat提示端口被占用的4種解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-01-01Java中的數(shù)組流ByteArrayOutputStream用法
Java中的ByteArrayOutputStream是java.io包中的一個類,用于在內存中創(chuàng)建字節(jié)數(shù)組緩沖區(qū),支持動態(tài)擴展,它繼承自OutputStream,允許以字節(jié)形式寫入數(shù)據(jù),無需與外部設備交互,常用方法包括write()、toByteArray()、toString()等2024-09-09簡單聊一聊Java線程池ThreadPoolExecutor
在使用線程池之后,開啟線程就變成了在線程池當中找到一個空閑的線程,銷毀線程變成了歸還線程到線程池的過程,下面這篇文章主要給大家介紹了關于Java線程池ThreadPoolExecutor的相關資料,需要的朋友可以參考下2022-06-06mybatis-plus分頁如何接收前端參數(shù)limit和page
這篇文章主要介紹了mybatis-plus分頁如何接收前端參數(shù)limit和page,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-01-01詳解SpringMVC組件之HandlerMapping(一)
這篇文章主要介紹了詳解SpringMVC組件之HandlerMapping(一),HandlerMapping組件是Spring?MVC核心組件,用來根據(jù)請求的request查找對應的Handler,在Spring?MVC中,有各式各樣的Web請求,每個請求都需要一個對應的Handler來處理,需要的朋友可以參考下2023-08-08