最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring?Boot中JSON數(shù)值溢出問題從報(bào)錯(cuò)到優(yōu)雅解決辦法

 更新時(shí)間:2025年04月26日 14:58:52   作者:一勺菠蘿丶  
這篇文章主要介紹了Spring?Boot中JSON數(shù)值溢出問題從報(bào)錯(cuò)到優(yōu)雅的解決辦法,通過修改字段類型為Long、添加全局異常處理和數(shù)據(jù)校驗(yàn),解決了該問題,文章還提供了類型范圍推薦場(chǎng)景和常見問題解答,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下

一、問題背景:為什么我的接口突然報(bào)錯(cuò)了?

假設(shè)你正在開發(fā)一個(gè) Spring Boot 接口,接收類似這樣的 JSON 請(qǐng)求:

{
  "size": 111111111111111111111
}

然后突然收到用戶的反饋:請(qǐng)求報(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 解析失敗!

二、為什么會(huì)發(fā)生這個(gè)錯(cuò)誤?

1. Java 數(shù)據(jù)類型的“容量”限制

  • int 類型最大只能表示 2147483647。
  • 當(dāng) JSON 中的數(shù)值超過這個(gè)范圍時(shí),int 裝不下,就會(huì)觸發(fā)溢出錯(cuò)誤。

2. 誰在幕后“搞事情”?

  • Jackson 庫:Spring Boot 默認(rèn)使用 Jackson 解析 JSON。
    當(dāng)字段類型是 int 或 Integer,但 JSON 數(shù)值過大時(shí),Jackson 會(huì)直接拋異常!

三、解決方案:三步搞定

第一步:修改字段類型(治本)

直接將 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 = "請(qǐng)求參數(shù)格式錯(cuò)誤,請(qǐng)檢查數(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ò)展知識(shí):為什么不用 Integer?

類型范圍推薦場(chǎng)景
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 存儲(chǔ)可能超大的值!

五、常見問題 FAQ

1. 前端傳的是字符串,也會(huì)報(bào)錯(cuò)嗎?

  • 不會(huì)!如果 JSON 中 size 是字符串 "111111111111111111111",需在后端用 String 類型接收,再手動(dòng)轉(zhuǎn)換。

2. 數(shù)據(jù)庫字段類型需要改嗎?

  • 如果 size 要存到數(shù)據(jù)庫(如 MySQL),記得同步修改為 BIGINT,否則會(huì)插入失??!

3. 為什么異常處理要捕獲 HttpMessageNotReadableException?

  • 這是 Spring 在解析請(qǐng)求體失敗時(shí)拋出的“總異常”,涵蓋所有 JSON 解析錯(cuò)誤(如類型不匹配、格式錯(cuò)誤等)。

六、總結(jié):避坑指南

  • 設(shè)計(jì)階段:根據(jù)業(yè)務(wù)場(chǎng)景選擇合適的數(shù)據(jù)類型。
    • 不確定時(shí),無腦用 Long!
  • 編碼階段
    • 添加數(shù)據(jù)校驗(yàn)(如 @Min@Max)。
    • 全局異常處理,返回友好提示。
  • 協(xié)作階段
    • 告知前端參數(shù)范圍和格式要求。
    • 更新接口文檔,明確 size 的類型和限制。

到此這篇關(guān)于Spring Boot中JSON數(shù)值溢出問題從報(bào)錯(cuò)到優(yōu)雅解決辦法的文章就介紹到這了,更多相關(guān)SpringBoot JSON數(shù)值溢出問題內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 配置java環(huán)境變量(linux mac windows7)

    配置java環(huán)境變量(linux mac windows7)

    本文給大家詳細(xì)總結(jié)介紹了Linux、MAC以及Windows下配置java環(huán)境變量的方法,非常的細(xì)致全面,有需要的小伙伴可以參考下
    2015-11-11
  • java虛擬機(jī)是做什么用的

    java虛擬機(jī)是做什么用的

    在本篇文章里小編給大家整理的是一篇關(guān)于java虛擬機(jī)作用等相關(guān)內(nèi)容,對(duì)此有興趣的朋友們可以學(xué)習(xí)參考下。
    2021-01-01
  • Spring Bean的初始化過程流程解析

    Spring Bean的初始化過程流程解析

    這篇文章主要介紹了Spring Bean的初始化過程是怎么樣的,本文將以面試官的視角,全面解析 Bean 初始化流程,附帶典型面試題與實(shí)戰(zhàn)講解,幫助你在技術(shù)面試中脫穎而出,需要的朋友可以參考下
    2025-06-06
  • Java中的ProcessBuilder類詳細(xì)解析

    Java中的ProcessBuilder類詳細(xì)解析

    這篇文章主要介紹了Java中的ProcessBuilder類詳細(xì)解析,ProcessBuilder類是J2SE 1.5在java.lang中新添加的一個(gè)新類,此類用于創(chuàng)建操作系統(tǒng)進(jìn)程,它提供一種啟動(dòng)和管理進(jìn)程的方法,需要的朋友可以參考下
    2024-01-01
  • java web實(shí)現(xiàn)分頁查詢實(shí)例方法

    java web實(shí)現(xiàn)分頁查詢實(shí)例方法

    在本篇文章里我們給大家分享了java web實(shí)現(xiàn)分頁查詢的詳細(xì)方法知識(shí)點(diǎn),有需要的朋友們參考學(xué)習(xí)下。
    2018-10-10
  • Java SPI機(jī)制原理與實(shí)戰(zhàn)技巧

    Java SPI機(jī)制原理與實(shí)戰(zhàn)技巧

    這段文章深入解析了JavaSPI機(jī)制原理與實(shí)戰(zhàn),涵蓋基本原理、代碼實(shí)戰(zhàn)及優(yōu)化方案,重點(diǎn)介紹了資源管理、異常處理、日志規(guī)范和單元測(cè)試的最佳實(shí)踐,助你寫出高質(zhì)量代碼,感興趣的朋友一起看看吧
    2026-06-06
  • Java并發(fā)編程實(shí)戰(zhàn)之從線程池到CompletableFuture詳解

    Java并發(fā)編程實(shí)戰(zhàn)之從線程池到CompletableFuture詳解

    文章總結(jié)了Java并發(fā)編程的關(guān)鍵點(diǎn),包括線程池的最佳實(shí)踐和監(jiān)控、CompletableFuture的異步編程、并發(fā)集合與工具類的使用、原子類與CAS、Fork/Join框架等內(nèi)容,強(qiáng)調(diào)了理解happens-before規(guī)則和內(nèi)存模型的重要性
    2026-04-04
  • java實(shí)現(xiàn)上傳文件類型檢測(cè)過程解析

    java實(shí)現(xiàn)上傳文件類型檢測(cè)過程解析

    這篇文章主要介紹了java實(shí)現(xiàn)上傳文件類型檢測(cè)過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • Java探索之string字符串的應(yīng)用代碼示例

    Java探索之string字符串的應(yīng)用代碼示例

    這篇文章主要介紹了Java探索之string字符串的應(yīng)用代碼示例,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-10-10
  • Java中callable的實(shí)現(xiàn)原理

    Java中callable的實(shí)現(xiàn)原理

    本文主要介紹了Java里的callable的實(shí)現(xiàn)原理,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-03-03

最新評(píng)論

和硕县| 屏东市| 茂名市| 昭通市| 麦盖提县| 白河县| 靖边县| 得荣县| 安塞县| 岑巩县| 宽甸| 富阳市| 奈曼旗| 中卫市| 双桥区| 浦县| 肥城市| 临夏县| 马尔康县| 永丰县| 廊坊市| 滦南县| 城口县| 海兴县| 宁津县| 荥阳市| 无为县| 高雄市| 宝丰县| 和田市| 新巴尔虎右旗| 钟祥市| 定边县| 五常市| 阳新县| 台北市| 连云港市| 邛崃市| 巩留县| 镶黄旗| 潜山县|