spring boot 中需用 @restcontrolleradvice 捕获 methodargumentnotvalidexception,提取 getfielderrors 中的 field 和 defaultmessage 构建错误映射,返回 400 状态码的 responseentity。

在 Spring Boot 的 REST 接口中,当使用 @Valid 或 @Validated 对请求参数(如 @RequestBody 对象)做校验,且校验失败时,Spring 会自动抛出 MethodArgumentNotValidException。默认情况下该异常会返回 400 响应和一堆堆栈信息,体验差且不统一。要捕获并优雅处理它,需通过全局异常处理器实现。
定义全局异常处理器
创建一个类,用 @ControllerAdvice 标记,再用 @ExceptionHandler 捕获 MethodArgumentNotValidException:
- 必须加
@ControllerAdvice(或限定为@RestControllerAdvice),才能作用于所有控制器 - 方法参数类型必须是
MethodArgumentNotValidException - 建议返回
ResponseEntity<map object>></map>或自定义错误响应对象,状态码设为HttpStatus.BAD_REQUEST
提取校验错误信息
从异常中获取 BindingResult,遍历所有 FieldError,提取字段名、错误消息等关键信息:
- 调用
ex.getBindingResult().getFieldErrors()获取所有字段级错误 - 常用字段:
field(出错字段名)、defaultMessage(校验注解的 message)、rejectedValue(非法值) - 可进一步根据
objectName区分不同 DTO,或合并多个字段错误到一个列表中
示例代码(简洁可用)
以下是一个典型实现:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
<font color="#888"><!-- 示例:@RestControllerAdvice 处理 --></font><br><strong>@RestControllerAdvice</strong><br>public class GlobalExceptionHandler {<br><br><strong>@ExceptionHandler(MethodArgumentNotValidException.class)</strong><br> public ResponseEntity<map string>> handleValidationExceptions(<br> MethodArgumentNotValidException ex) {<br> Map<string string> errors = new HashMap();<br> ex.getBindingResult().getFieldErrors().forEach(error -><br> errors.put(error.getField(), error.getDefaultMessage())<br> );<br> return ResponseEntity.badRequest().body(errors);<br> }<br>}</string></map>
配合一个带校验注解的 DTO 使用,比如:
public class UserDTO {<br> @NotBlank(message = "用户名不能为空")<br> private String username;<br><br> @Min(value = 18, message = "年龄不能小于18")<br> private Integer age;<br> // getter/setter...<br>}
再在 Controller 中使用:
@PostMapping("/users")<br>public String createUser(@Valid @RequestBody UserDTO dto) {<br> return "success";<br>}
此时若传入 {"username":"","age":16},将返回:
{<br> "username": "用户名不能为空",<br> "age": "年龄不能小于18"<br>}
补充说明
- 如果用的是
@RequestParam或@PathVariable校验失败,抛出的是ConstraintViolationException,需另写一个@ExceptionHandler处理 - 确保项目已启用校验支持(Spring Boot 2.3+ 默认不包含
spring-boot-starter-validation,需手动添加依赖) - 可结合统一响应结构(如
Result<t></t>)封装错误返回,保持前后端约定一致
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










