Spring Boot 中处理 JSON 数值溢出问题:从报错到优雅解决

news2025/4/25 22:53:36

一、问题背景:为什么我的接口突然报错了?

假设你正在开发一个 Spring Boot 接口,接收类似这样的 JSON 请求:

{
  "size": 111111111111111111111
}

然后突然收到用户的反馈:请求报错啦!
查看日志,发现一个刺眼的异常:

JSON parse error: Numeric value (111111111111111111111) out of range of int

翻译成“人话”:
前端传的 size 值太大,后端用 int 类型接收时,超出了 int 的范围(-2147483648 ~ 2147483647),导致 JSON 解析失败!


二、为什么会发生这个错误?

1. Java 数据类型的“容量”限制
  • int 类型最大只能表示 2147483647
  • 当 JSON 中的数值超过这个范围时,int 装不下,就会触发溢出错误。
2. 谁在幕后“搞事情”?
  • Jackson 库:Spring Boot 默认使用 Jackson 解析 JSON。
    当字段类型是 intInteger,但 JSON 数值过大时,Jackson 会直接抛异常!

三、解决方案:三步搞定

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

直接将 size 的字段类型改为 Long,一步到位解决问题!

public class EsSearchResultRequest {
    private Long size;  // ✅ 改为 Long 类型
    // 其他字段...
}

为什么有效?

  • Long 的范围是 -9223372036854775808 ~ 9223372036854775807,足够容纳超大数值。

第二步:全局异常处理(优雅提示)

GlobalExceptionHandler 中捕获异常,返回友好提示:

@ExceptionHandler(HttpMessageNotReadableException.class)
public ResponseEntity<String> handleHttpMessageNotReadable(HttpMessageNotReadableException ex) {
    String errorMessage = "请求参数格式错误,请检查数值范围";
    // 提取具体错误原因(可选)
    if (ex.getCause() instanceof JsonMappingException) {
        errorMessage = ex.getCause().getMessage(); 
    }
    return ResponseEntity.badRequest().body(errorMessage);
}

效果示例:
前端收到提示:

Numeric value (111111111111111111111) out of range of int

第三步:数据校验(防御性编程)

如果业务要求 size 必须是较小的数值,可添加校验逻辑:

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小数值(如状态码)
Long-2⁶³ ~ 2⁶³-1大数值(如 ID、时间戳)
BigInteger无限(内存限制)天文数字

经验法则:

  • 不确定数值大小时,优先用 Long
  • 永远不要用 int 存储可能超大的值!

五、常见问题 FAQ

1. 前端传的是字符串,也会报错吗?
  • 不会!如果 JSON 中 size 是字符串 "111111111111111111111",需在后端用 String 类型接收,再手动转换。
2. 数据库字段类型需要改吗?
  • 如果 size 要存到数据库(如 MySQL),记得同步修改为 BIGINT,否则会插入失败!
3. 为什么异常处理要捕获 HttpMessageNotReadableException
  • 这是 Spring 在解析请求体失败时抛出的“总异常”,涵盖所有 JSON 解析错误(如类型不匹配、格式错误等)。

六、总结:避坑指南

  1. 设计阶段:根据业务场景选择合适的数据类型。
    • 不确定时,无脑用 Long
  2. 编码阶段
    • 添加数据校验(如 @Min@Max)。
    • 全局异常处理,返回友好提示。
  3. 协作阶段
    • 告知前端参数范围和格式要求。
    • 更新接口文档,明确 size 的类型和限制。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2342761.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

oracle 锁的添加方式和死锁的解决

DML锁添加方式 DML 锁可由一个用户进程以显式的方式加锁&#xff0c;也可通过某些 SQL 语句隐含方式实现。 DML 锁有三种加锁方式&#xff1a;共享锁方式、独占锁方式、共享更新。 共享锁&#xff0c;独占锁用于 TM 锁&#xff0c;共享锁用于 TX 锁。 1)共享方式的表级锁 共享方…

基于Hadoop的音乐推荐系统(源码+lw+部署文档+讲解),源码可白嫖!

摘要 本毕业生数据分析与可视化系统采用B/S架构&#xff0c;数据库是MySQL&#xff0c;网站的搭建与开发采用了先进的Java语言、爬虫技术进行编写&#xff0c;使用了Spring Boot框架。该系统从两个对象&#xff1a;由管理员和用户来对系统进行设计构建。主要功能包括&#xff…

Java查询数据库表信息导出Word

参考: POI生成Word多级标题格式_poi设置word标题-CSDN博客 1.概述 使用jdbc查询数据库把表信息导出为word文档, 导出为word时需要下载word模板文件。 已实现数据库: KingbaseES, 实现代码: 点击跳转 2.效果图 2.1.生成word内容 所有数据库合并 数据库不合并 2.2.生成文件…

RK3588平台用v4l工具调试USB摄像头实践(亮度,饱和度,对比度,色相等)

目录 前言:v4l-utils简介 一&#xff1a;查找当前的摄像头设备 二&#xff1a;查看当前摄像头支持的v4l2-ctl调试参数 三根据提示设置对应参数&#xff0c;在提示范围内设置 四&#xff1a;常用调试命令 五:应用内执行命令方法 前言:v4l-utils简介 v4l-utils工具是由Linu…

在Linux中,使用read函数去读取写入文件空洞部分时,读取出来的内容是什么?为什么这样操作,以及应用场景?

使用 read 函数读取文件空洞&#xff08;hole&#xff09;部分时&#xff0c;读取到的内容会被系统填充为 \0&#xff08;即零字节&#xff09;。文件空洞是稀疏文件中未实际分配磁盘空间的区域&#xff0c;但逻辑上表现为连续的零字节。 1.在指定空洞部分后&#xff0c;写入数…

Qt6笔记-对Qt6中对CMakeLists.txt的解析

首先&#xff0c;新建Qt Console Application项目。 下面对CMakeLists.txt进行次理解。新建好后&#xff0c;Qt Creator会生成CMakeLists.txt&#xff0c;具体内容如下&#xff1a; cmake_minimum_required(VERSION 3.16)project(EasyCppMain LANGUAGES CXX)set(CMAKE_AUTOUIC…

CIFAR10图像分类学习笔记(三)---数据加载load_cifar10

新创建一个load_cifar10源文件 需要导入的包 import glob from torchvision import transforms from torch.utils.data import DataLoader ,Dataset import os #读取工具 from PIL import Image import numpy as np 01同样定义10个类别的标签名数组 label_name ["airpl…

计算机视觉cv入门之答题卡自动批阅

前边我们已经讲解了使用cv2进行图像预处理与边缘检测等方面的知识&#xff0c;这里我们以答题卡自动批阅这一案例来实操一下。 大致思路 答题卡自动批阅的大致流程可以分为这五步&#xff1a;图像预处理-寻找考试信息区域与涂卡区域-考生信息区域OCR识别-涂卡区域填涂答案判断…

Java学习手册:JSON 数据格式基础知识

1. JSON 简介 JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式&#xff0c;易于阅读和编写&#xff0c;也易于机器解析和生成。它最初来源于 JavaScript&#xff0c;但如今已被许多语言所采用&#xff0c;包括 Java、Python、C 等。JSON 以…

《重塑AI应用架构》系列: Serverless与MCP融合创新,构建AI应用全新智能中枢

在人工智能飞速发展的今天&#xff0c;数据孤岛和工具碎片化问题一直是阻碍AI应用高效发展的两大难题。由于缺乏统一的标准&#xff0c;AI应用难以无缝地获取和充分利用数据价值。 为了解决这些问题&#xff0c;2024年AI领域提出了MCP&#xff08;Model Context Protocol模型上…

深度图可视化

import cv2# 1.读取一张深度图 depth_img cv2.imread("Dataset_depth/images/train/1112_0-rgb.png", cv2.IMREAD_UNCHANGED) print(depth_img.shape) cv2.imshow("depth", depth_img) # (960, 1280) print(depth_img)# 读取一张rgb的图片做对比 input_p…

微软Edge浏览器字体设置

前言 时间&#xff1a;2025年4月 自2025年4月起&#xff0c;微软Edge浏览器的默认字体被微软从微软雅黑替换成了Noto Sans&#xff0c;如下图。Noto Sans字体与微软雅黑风格差不多&#xff0c;但在4K以下分辨率的显示器上较微软雅黑更模糊&#xff0c;因此低分辨率的显示器建议…

Vue生命周期详细解析

前言 Vue.js作为当前最流行的前端框架之一&#xff0c;其生命周期钩子函数是每个Vue开发者必须掌握的核心概念。本文将全面解析Vue的生命周期&#xff0c;帮助开发者更好地理解Vue实例的创建、更新和销毁过程。 一、Vue生命周期概述 Vue实例从创建到销毁的整个过程被称为Vue…

基于c#,wpf,ef框架,sql server数据库,音乐播放器

详细视频: 【基于c#,wpf,ef框架,sql server数据库&#xff0c;音乐播放器。-哔哩哔哩】 https://b23.tv/ZqmOKJ5

前端项目搭建集锦:vite、vue、react、antd、vant、ts、sass、eslint、prettier、浏览器扩展,开箱即用,附带项目搭建教程

前端项目搭建集锦&#xff1a;vite、vue、react、antd、vant、ts、sass、eslint、prettier、浏览器扩展&#xff0c;开箱即用&#xff0c;附带项目搭建教程 前言&#xff1a;一、Vue项目下载快速通道二、React项目下载快速通道三、BrowserPlugins项目下载快速通道四、项目搭建教…

什么是Maven

Maven的概念 Maven是一个一键式的自动化的构建工具。Maven 是 Apache 软件基金会组织维护的一款自动化构建工具&#xff0c;专注服务于Java 平台的项目构建和依赖管理。Maven 这个单词的本意是&#xff1a;专家&#xff0c;内行。Maven 是目前最流行的自动化构建工具&#xff0…

neo4j中节点内的名称显示不全解决办法(如何让label在节点上自动换行)

因为节点过多而且想让节点中所有文字都显示出来而放大节点尺寸 从neo4j中导出png,再转成PDF来查看时&#xff0c;要看清节点里面的文字就得放大5倍才行 在网上看了很多让里面文字换行的办法都不行 然后找到一个比较靠谱的办法是在要显示的标签内加换行符 但是我的节点上显示的是…

【GIT】github中的仓库如何删除?

你可以按照以下步骤删除 GitHub 上的仓库&#xff08;repository&#xff09;&#xff1a; &#x1f6a8; 注意事项&#xff1a; ❗️删除仓库是不可恢复的操作&#xff0c;所有代码、issue、pull request、release 等内容都会被永久删除。 &#x1f9ed; 删除 GitHub 仓库步骤…

3台CentOS虚拟机部署 StarRocks 1 FE+ 3 BE集群

背景&#xff1a;公司最近业务数据量上去了&#xff0c;需要做一个漏斗分析功能&#xff0c;实时性要求较高&#xff0c;mysql已经已经不在适用&#xff0c;做了个大数据技术栈选型调研后&#xff0c;决定使用StarRocks StarRocks官网&#xff1a;StarRocks | A High-Performa…

【HCIA】简易的两个VLAN分别使用DHCP分配IP

前言 之前我们通过 静态ip地址实现了Vlan间通信 &#xff0c;现在我们添加一个常用的DHCP功能。 文章目录 前言1. 配置交换机2. 接口模式3. 全局模式后记修改记录 1. 配置交换机 首先&#xff0c;使用DHCP&#xff0c;需要先启动DHCP服务&#xff1a; [Huawei]dhcp enable I…