欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

假設(shè)你正在開(kāi)發(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ù)值超過(guò)這個(gè)范圍時(shí),int 裝不下,就會(huì)觸發(fā)溢出錯(cuò)誤。

2. 誰(shuí)在幕后“搞事情”?

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

三、解決方案:三步搞定

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

直接將 size 的字段類型改為 Long,一步到位解決問(wèn)題!

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無(wú)限(內(nèi)存限制)天文數(shù)字

經(jīng)驗(yàn)法則:

  • 不確定數(shù)值大小時(shí),優(yōu)先用 Long。
  • 永遠(yuǎn)不要用 int 存儲(chǔ)可能超大的值!

五、常見(jiàn)問(wèn)題 FAQ

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

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

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

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

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

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

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

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

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

相關(guān)文章

  • 關(guān)于eclipse中運(yùn)行tomcat提示端口被占用的4種解決

    關(guān)于eclipse中運(yùn)行tomcat提示端口被占用的4種解決

    這篇文章主要介紹了關(guān)于eclipse中運(yùn)行tomcat提示端口被占用的4種解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • Java實(shí)現(xiàn)單機(jī)版五子棋游戲的示例代碼

    Java實(shí)現(xiàn)單機(jī)版五子棋游戲的示例代碼

    五子棋是世界智力運(yùn)動(dòng)會(huì)競(jìng)技項(xiàng)目之一,是一種兩人對(duì)弈的純策略型棋類游戲,是世界智力運(yùn)動(dòng)會(huì)競(jìng)技項(xiàng)目之一。本文將用java語(yǔ)言實(shí)現(xiàn)單機(jī)版五子棋游戲,感興趣的可以了解一下
    2022-09-09
  • java中深復(fù)制知識(shí)點(diǎn)詳解

    java中深復(fù)制知識(shí)點(diǎn)詳解

    在本篇文章里小編給大家整理了關(guān)于java中深復(fù)制知識(shí)點(diǎn)詳解內(nèi)容,有需要的朋友們可以學(xué)習(xí)下。
    2020-12-12
  • Java中的數(shù)組流ByteArrayOutputStream用法

    Java中的數(shù)組流ByteArrayOutputStream用法

    Java中的ByteArrayOutputStream是java.io包中的一個(gè)類,用于在內(nèi)存中創(chuàng)建字節(jié)數(shù)組緩沖區(qū),支持動(dòng)態(tài)擴(kuò)展,它繼承自O(shè)utputStream,允許以字節(jié)形式寫(xiě)入數(shù)據(jù),無(wú)需與外部設(shè)備交互,常用方法包括write()、toByteArray()、toString()等
    2024-09-09
  • 簡(jiǎn)單聊一聊Java線程池ThreadPoolExecutor

    簡(jiǎn)單聊一聊Java線程池ThreadPoolExecutor

    在使用線程池之后,開(kāi)啟線程就變成了在線程池當(dāng)中找到一個(gè)空閑的線程,銷毀線程變成了歸還線程到線程池的過(guò)程,下面這篇文章主要給大家介紹了關(guān)于Java線程池ThreadPoolExecutor的相關(guān)資料,需要的朋友可以參考下
    2022-06-06
  • 關(guān)于Java中finalize析構(gòu)方法的作用詳解

    關(guān)于Java中finalize析構(gòu)方法的作用詳解

    構(gòu)造方法用于創(chuàng)建和初始化類對(duì)象,也就是說(shuō),構(gòu)造方法負(fù)責(zé)”生出“一個(gè)類對(duì)象,并可以在對(duì)象出生時(shí)進(jìn)行必要的操作,在這篇文章中會(huì)給大家簡(jiǎn)單介紹一下析構(gòu)方法,需要的朋友可以參考下
    2023-05-05
  • mybatis-plus分頁(yè)如何接收前端參數(shù)limit和page

    mybatis-plus分頁(yè)如何接收前端參數(shù)limit和page

    這篇文章主要介紹了mybatis-plus分頁(yè)如何接收前端參數(shù)limit和page,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • javacv ffmpeg使用原生ffmpeg命令方式

    javacv ffmpeg使用原生ffmpeg命令方式

    在使用javacv集成ffmpeg進(jìn)行視頻處理時(shí),發(fā)現(xiàn)使用ffmpeg-6.0-1.5.9版本出現(xiàn)原生命令執(zhí)行失敗的問(wèn)題,通過(guò)降級(jí)至ffmpeg-5.1.2-1.5.8版本,問(wèn)題得到解決,此外,ffprobe可以用于獲取視頻屬性,需確保視頻片段屬性一致性
    2024-11-11
  • 詳解SpringMVC組件之HandlerMapping(一)

    詳解SpringMVC組件之HandlerMapping(一)

    這篇文章主要介紹了詳解SpringMVC組件之HandlerMapping(一),HandlerMapping組件是Spring?MVC核心組件,用來(lái)根據(jù)請(qǐng)求的request查找對(duì)應(yīng)的Handler,在Spring?MVC中,有各式各樣的Web請(qǐng)求,每個(gè)請(qǐng)求都需要一個(gè)對(duì)應(yīng)的Handler來(lái)處理,需要的朋友可以參考下
    2023-08-08
  • Java中的值傳遞以及引用傳遞和數(shù)組傳遞詳解

    Java中的值傳遞以及引用傳遞和數(shù)組傳遞詳解

    這篇文章主要介紹了Java中的值傳遞以及引用傳遞和數(shù)組傳遞詳解,Java不允許程序員選擇按值傳遞還是按引用傳遞各個(gè)參數(shù),就對(duì)象而言,不是將對(duì)象本身傳遞給方法,而是將對(duì)象的的引用或者說(shuō)對(duì)象的首地址傳遞給方法,引用本身是按值傳遞的,需要的朋友可以參考下
    2023-07-07

最新評(píng)論