当前位置: 首页 > news >正文

SpringBoot 全局异常统一处理:BindException(绑定异常)

概述

在Spring Boot应用中,数据绑定是一个至关重要的环节,它负责将HTTP请求中的参数映射到控制器方法的入参对象上。在这个过程中如果遇到任何问题,如参数缺失、类型不匹配或验证失败等,Spring MVC将会抛出一个org.springframework.validation.BindException异常。本文将深入解析BindException异常的原因和处理方式。

数据绑定异常的来源

BindException通常与数据绑定和参数校验紧密相关。当用户通过HTTP请求向服务器发送数据时,Spring MVC框架会尝试自动将这些请求参数绑定到控制器方法的入参对象上。如果在这个过程中发生以下情况,就可能引发BindException异常:

  1. 参数映射错误:请求中的参数未能正确地映射到目标对象的属性上。
  2. 注解校验失败:对象属性使用了javax.validation或者org.springframework.validation包下的注解进行校验(如@NotNull、@Size等),而传入的值不符合这些注解所定义的约束条件。

具体应用场景示例

本段所说的 请求参数,均指的是控制器方法的入参对象的属性。

  • 必填字段为空:若某个字段标记为@NotBlank但未接收到对应的请求参数,则会触发BindException异常。
  • 数据格式不匹配:例如,尝试将请求参数的字符串值转换为目标类型(如整数或日期)时无法成功转换。
  • 字段长度超出限制:对于有最大或最小长度限制的字段,当请求参数的长度超过这些限制时,会引发异常。
  • 正则表达式不匹配:当字段的值需满足特定的正则表达式模式,而实际提供的参数不满足该模式时,也会导致异常。
  • 自定义验证逻辑失败:通过@Valid注解配合自定义验证器进行参数校验时,如果验证失败,同样会抛出BindException异常。

异常处理代码

核心代码

在Spring Boot应用中,我们可以利用@ExceptionHandler注解来捕获并处理BindException异常,如下所示的代码片段提供了一种通用的异常处理策略:

    /*** 参数校验异常:对象参数校验。*/@ExceptionHandler@ResponseStatus(HttpStatus.BAD_REQUEST)public Result<Void> handleException(BindException e, HandlerMethod handlerMethod) {logInfo(e, handlerMethod);List<FieldError> fieldErrors = e.getFieldErrors();String userMessage = UserTipGenerator.getUserMessage(fieldErrors);String errorMessageCore = ErrorMessageGenerator.getErrorMessage(fieldErrors);String errorMessage = String.format("【参数校验异常】(错误数量:%s):%s", e.getErrorCount(), errorMessageCore);return Result.fail(userMessage, String.valueOf(HttpStatus.BAD_REQUEST.value()), errorMessage);}

上述代码中,当出现BindException异常时,系统将返回一个状态码为400(Bad Request)的结果,并附带详细的错误信息,包括哪个字段校验失败以及失败原因。

相关代码:UserTipGenerator,ErrorMessageGenerator

在这里插入图片描述

在这里插入图片描述

详细代码,请参考后面的参考文章《SpringBoot 全局异常统一处理(AOP):@RestControllerAdvice + @ExceptionHandler + @ResponseStatus》

测试案例

1. 必填字段为空

测试代码

假设我们有一个新增用户的接口,其中入参要求不能为空:

    @PostMapping("users")@Operation(summary = "新增用户")public void addUser(@Valid @RequestBody UserAddParam param) {log.info("测试:新增用户,Post请求。param={}", param);}
package com.example.web.response.model.param;import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;import javax.validation.constraints.NotBlank;@Data
@Schema(name = "新增用户Param")
public class UserAddParam {@NotBlank(message = "姓名,不能为空")@Schema(description = "姓名", example = "张三")private String name;// ...
}

在这里插入图片描述

未处理时情况

  • 请求响应

在这里插入图片描述

  • 控制台的错误日志

在这里插入图片描述

处理后接口请求响应

在这里插入图片描述

2. 数据格式不匹配

一下两种情况,会导致出现数据格式异常:

  1. 输入无法成功转换指定的数字类型。比如,入参的数据类型为整数Integer,但输入为:[张三] 。
  2. 输入的值超过允许的最大值。比如,入参的数据类型为整数Integer,但输入为:[1234567890123456789],而Integer的最大值为[231-1,即 2147483647] ;此时内嵌的异常为 NumberFormatException

测试代码

    @GetMapping(path = "users")@Operation(summary = "查询用户列表", description = "测试:BindException。参数校验异常:Get请求,Query参数,以对象的形式接收。")public List<UserVO> listUsers(@Valid UserQuery userQuery, PageQuery pageQuery,HttpServletRequest request, HttpServletResponse response, HttpSession session) {log.info("查询用户列表。userQuery={},pageQuery={}", userQuery, pageQuery);// 业务代码...}
package com.example.core.model;import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import org.springdoc.api.annotations.ParameterObject;@Data
@ParameterObject
@Schema(name = "分页参数Query")
public class PageQuery {@Schema(description = "当前页码", type = "Integer", defaultValue = "1", example = "1", minimum = "1")private Integer pageNumber = 1;@Schema(description = "每 1 页的数据量", type = "Integer", defaultValue = "10", example = "10", minimum = "1", maximum = "100")private Integer pageSize = 10;}

未处理的情况

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

处理后接口请求响应

在这里插入图片描述

在这里插入图片描述

3. 自定义验证逻辑失败

参考相关专栏:《SpringBoot - 接口参数校验》

总结

在没有处理BindException的情况下,如果客户端提交了缺少必要参数的请求,服务端将返回包含错误信息的标准HTTP响应,并在控制台打印详细的错误日志。而经过上述异常处理器处理后,客户端接收到的响应将以更友好的格式呈现错误详情,便于快速定位和修复问题。

通过适当地处理BindException异常,不仅可以提升应用的健壮性,还能优化用户体验,使得API接口的错误反馈更加清晰明确。

参考文章

SpringBoot 全局异常统一处理(AOP):@RestControllerAdvice + @ExceptionHandler + @ResponseStatus

相关文章:

SpringBoot 全局异常统一处理:BindException(绑定异常)

概述 在Spring Boot应用中&#xff0c;数据绑定是一个至关重要的环节&#xff0c;它负责将HTTP请求中的参数映射到控制器方法的入参对象上。在这个过程中如果遇到任何问题&#xff0c;如参数缺失、类型不匹配或验证失败等&#xff0c;Spring MVC将会抛出一个org.springframewo…...

ucloud轻量云(wordpress)配置ssl

ucloud 轻量云(wordpress)配置ssl 1、上传ssl证书到/usr/local/software/apache/conf&#xff0c;这里的文件名和内容与ucloud控制台下载下来的文件名和内容保持一致 2、修改httpd.conf文件 vim /usr/local/software/apache/conf/httpd.conf 找到下面两行&#xff0c;去掉注…...

电脑/设备网络共享给其他设备上网

文章目录 一、概述二、设置网络共享2.1 电脑可以上网&#xff0c;通过网络共享让其他设备也可以上网2.2 手机如何使用USB数据线共享网络给电脑 一、概述 现在有如下几种情况&#xff1a; 设备本身不能上网&#xff0c;需要通过电脑上网 笔记本WIFI连热点上网&#xff0c;然后…...

vue之虚拟滚动

一、解决的问题 对于大量数据的懒加载&#xff0c;我们可以使用虚拟滚动的技术。虚拟滚动的原理是只渲染可视区域内的数据&#xff0c;当用户滚动时&#xff0c;动态计算并渲染新的可视数据&#xff0c;从而实现大数据量的流畅滚动。 在Vue中&#xff0c;我们可以使用第三方库…...

Redis学习指南(11)-Redis的有序集合数据类型介绍

文章目录 特点和用途常用命令插入操作查询操作删除操作 示例总结 Redis的有序集合数据类型是一种高效的数据结构&#xff0c;能够存储多个成员和对应的分值&#xff0c;并能够根据分值进行快速的查找、插入和删除操作。本文将详细介绍Redis的有序集合数据类型&#xff0c;包括其…...

Spring的纯注解配置

1.环境搭建 1.1.创建工程 1.2.待改造的问题 我们发现&#xff0c;之所以我们现在离不开xml配置文件&#xff0c;是因为我们有一处很关键的配置&#xff0c;如果他要也能用注解配置&#xff0c;那么我们就可以脱离xml文件了&#xff1a; 1.2.1.jdbc配置 <context:propert…...

numpy 筛选多段数据

目录 掩码方式 利用切片 掩码方式 range_to_remove list(range(77-1, 111-1)) list(range(122-1, 135-1))keep_mask np.ones(image0_cut.shape[0], dtypebool)keep_mask[range_to_remove] Falseprocessed_data image0_cut[keep_mask] 利用切片 import numpy as np# 假设…...

【Kotlin】协程的字节码原理

前言 协程是Koltin语言最重要的特性之一&#xff0c;也是最难理解的特性。网上关于kotlin协程的描述也是五花八门&#xff0c;有人说它是轻量级线程&#xff0c;有人说它是无阻塞式挂起&#xff0c;有人说它是一个异步框架等等&#xff0c;众说纷芸。甚至还有人出了书籍专门介…...

区间预测 | Matlab实现LSSVM-ABKDE的最小二乘支持向量机结合自适应带宽核密度估计多变量回归区间预测

区间预测 | Matlab实现LSSVM-ABKDE的最小二乘支持向量机结合自适应带宽核密度估计多变量回归区间预测 目录 区间预测 | Matlab实现LSSVM-ABKDE的最小二乘支持向量机结合自适应带宽核密度估计多变量回归区间预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现…...

基于深度学习的实例分割的Web应用

基于深度学习的实例分割的Web应用 1. 项目简介1.1 模型部署1.2 Web应用 2. Web前端开发3. Web后端开发4. 总结 1. 项目简介 这是一个基于深度学习的实例分割Web应用的项目介绍。该项目使用PaddlePaddle框架&#xff0c;并以PaddleSeg训练的图像分割模型为例。 1.1 模型部署 …...

20240115如何在线识别俄语字幕?

20240115如何在线识别俄语字幕&#xff1f; 2024/1/15 21:25 百度搜索&#xff1a;俄罗斯语 音频 在线识别 字幕 Bilibili&#xff1a;俄语AI字幕识别 音视频转文字 字幕小工具V1.2 BING&#xff1a;音视频转文字 字幕小工具V1.2 https://www.bilibili.com/video/BV1d34y1F7…...

Flink 处理函数(1)—— 基本处理函数

在 Flink 的多层 API中&#xff0c;处理函数是最底层的API&#xff0c;是所有转换算子的一个概括性的表达&#xff0c;可以自定义处理逻辑 在处理函数中&#xff0c;我们直面的就是数据流中最基本的元素&#xff1a;数据事件&#xff08;event&#xff09;、状态&#xff08;st…...

Linux系统下编译MPlayer

一、编译MPlayer 在 http://www.mplayerhq.hu/design7/dload.html 下载MPlayer源码 执行命令&#xff1a; tar -xf MPlayer-1.5.tar.xz cd MPlayer-1.5 ./configure --prefix$(pwd)/install --yasm make make install 然后在install/bin目录下即会生成mplayer的可执行文件 二…...

事务的ACID属性是什么?为什么它们很重要?

引言 在现代的数据库和事务处理系统中&#xff0c;事务处理是一项非常重要的技术。在数据库中&#xff0c;事务是指一组被视为单个逻辑操作单元的SQL语句序列&#xff0c;它们要么全部成功执行&#xff0c;要么全部不执行。事务可以确保数据库在执行时保持一致性和可靠性。ACI…...

计算机毕业设计 基于Java的手机销售网站的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…...

Redis相关命令详解及其原理

Redis概念 Redis&#xff0c;英文全称是remote dictionary service&#xff0c;也就是远程字典服务。这是kv存储数据库。Redis&#xff0c;包括所有的数据库&#xff0c;都是请求-回应模式&#xff0c;通俗来说就是数据库不会主动地要给前台推送数据&#xff0c;只有前台发送了…...

go语言中的GoMock

GoMock是一个Go框架。它与内置的测试包整合得很好&#xff0c;并在单元测试时提供了灵活性。正如我们所知&#xff0c;对具有外部资源&#xff08;数据库、网络和文件&#xff09;或依赖关系的代码进行单元测试总是很麻烦。 安装 为了使用GoMock&#xff0c;我们需要安装gomo…...

DIFFWAVE: A VERSATILE DIFFUSION MODEL FOR AUDIO SYNTHESIS (Paper reading)

DIFFWAVE: A VERSATILE DIFFUSION MODEL FOR AUDIO SYNTHESIS Zhifeng Kong, Computer Science and Engineering, UCSD, ICLR2021, Code, Paper 1. 前言 在这项工作中&#xff0c;我们提出了DiffWave&#xff0c;这是一种用于条件和无条件波形生成的多功能扩散概率模型。该模…...

排序算法8----归并排序(非递归)(C)

1、介绍 归并排序既可以是内排序&#xff08;在内存上的数据排序&#xff09;&#xff0c;也可以是外排序&#xff08;磁盘上&#xff09;&#xff08;硬盘&#xff09;&#xff08;在文件中的数据排序&#xff09;。 其他排序一般都是内排序。 区别于快速排序的非递归&#xf…...

Golang 里的 context

context 的作用 go 的编程中&#xff0c;常常会在一个 goroutine 中启动多个 goroutine&#xff0c;然后有可能在这些 goroutine 中又启动多个 goroutine。 如上图&#xff0c;在 main 函数中&#xff0c;启动了一个 goroutine A 和 goroutine B&#xff0c;然后 goroutine A …...

微软Fara1.5:开源浏览器智能体全面超越OpenAI和Google,27B小模型如何做到的?

摘要&#xff1a; 2026年5月22日&#xff0c;微软研究院AI Frontiers实验室发布Fara1.5系列浏览器智能体&#xff0c;在两项主流基准测试中击败OpenAI Operator和Google Gemini 2.5 Computer Use。值得关注的是&#xff0c;这是一款完全开源的模型&#xff0c;权重开放、推理代…...

避坑指南:用SARIMA做时间序列预测时,这5个参数调优错误千万别犯(Python实战)

SARIMA模型调优实战&#xff1a;避开时间序列预测中的五大陷阱引言在数据分析领域&#xff0c;时间序列预测一直是个既迷人又充满挑战的课题。每当我看到那些起伏的曲线&#xff0c;总能感受到数据背后隐藏的故事和规律。SARIMA模型作为时间序列分析的重要工具&#xff0c;因其…...

ICLR 2026小米AI 技术深度解读

注&#xff1a;小米最新的 AI 顶会成果实际入选了 ICLR 2026&#xff08;国际学习表征会议&#xff09;&#xff0c;推测您提到的 ICML 为会议名称的混淆&#xff0c;本文将基于小米此次入选的核心研究成果&#xff0c;以及配套的 MiMo-V2.5 系列技术&#xff0c;按您要求的五大…...

Android 全栈体系 150 讲 - 49 深度完整版 Android 常用设计模式 + 架构模式 源码剖析、业务落地、面试精讲

...

TunaMH算法:基于谱间隙优化的小批量MCMC精确采样

1. 项目概述&#xff1a;当MCMC遇见大数据&#xff0c;我们如何“精打细算”地采样&#xff1f;搞贝叶斯推断或者统计计算的朋友&#xff0c;对马尔可夫链蒙特卡洛&#xff08;MCMC&#xff09;肯定不陌生。这玩意儿就像个不知疲倦的探险家&#xff0c;在复杂的概率分布地形里四…...

FanControl终极指南:5步实现Windows风扇智能控制,让电脑散热更安静更高效

FanControl终极指南&#xff1a;5步实现Windows风扇智能控制&#xff0c;让电脑散热更安静更高效 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://g…...

【ChatGPT项目计划书生成实战指南】:20年PMO总监亲授5大高转化模板+3类避坑红线

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;ChatGPT项目计划书生成的核心价值与适用场景 在敏捷开发与跨职能协作日益普及的今天&#xff0c;项目计划书不再仅是交付物&#xff0c;更是对目标对齐、资源预判与风险共识的关键载体。ChatGPT驱动的项目计划…...

Sora 2输出黑边/裁切异常?GPU解码器与渲染管线冲突导致的16:9→4:3畸变真相(NVIDIA/AMD/Apple芯片差异对照表)

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;Sora 2视频后期处理技巧 Sora 2作为新一代AI视频生成与编辑平台&#xff0c;其内置的后期处理模块支持高精度帧级调控、语义驱动的局部重绘及时间一致性增强。掌握其核心处理技巧&#xff0c;可显著提升输出视…...

李飞飞团队新作ESI-Bench:具身智能的ImageNet来了!

点击下方卡片&#xff0c;关注“CVer”公众号AI/CV重磅干货&#xff0c;第一时间送达【具身智能】微信群成立&#xff01;大家快扫码加入具身星球&#xff0c;将获得&#xff1a;最新具身智能技术和项目、❤️ 从入门到精通的学习路线、&#x1f916; 具身智能招聘(实习/校招/社…...

使用Taotoken后API调用延迟与账单透明度的实际体验

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 使用Taotoken后API调用延迟与账单透明度的实际体验 1. 引言 对于需要调用多种大模型API的开发者而言&#xff0c;统一接入和成本管…...