Spring Boot 参数校验失败默认抛出 MethodArgumentNotValidException 或 ConstraintViolationException,需用 @RestControllerAdvice 全局捕获并返回结构化 400 响应,包含字段、值及错误原因,确保校验注解生效且不误写 BindingResult。

Spring Boot 中参数校验失败默认会抛出 MethodArgumentNotValidException(针对 @Valid + @RequestBody)或 ConstraintViolationException(针对 @Validated 方法参数或 @Valid 嵌套对象),这些异常若不捕获,就会触发 Spring Boot 默认的 400 错误页或杂乱 JSON,前端无法统一解析。全局捕获的关键是用 @RestControllerAdvice 拦截这两类异常,并返回结构化错误响应。
捕获 MethodArgumentNotValidException(请求体校验失败)
这是最常见的场景,比如用户提交 JSON 数据且实体类字段加了 @NotBlank、@Size 等注解。需在全局异常处理器中专门处理:
- 添加
@ExceptionHandler(MethodArgumentNotValidException.class)方法 - 从异常中提取
BindingResult,遍历FieldError获取字段名、错误消息 - 组装为统一格式(如
Result.fail(400, "用户名不能为空")或带字段详情的列表) - 注意:该异常只触发于
@RequestBody+@Valid组合,不适用于路径变量或查询参数
捕获 ConstraintViolationException(方法级校验或嵌套校验失败)
当你在 Service 层或 Controller 方法参数上使用 @Validated,或对非 @RequestBody 对象(如 @RequestParam 封装的 DTO)做校验时,抛出的是这个异常:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- 用
@ExceptionHandler(ConstraintViolationException.class)单独捕获 - 调用
exception.getConstraintViolations()遍历所有违规项 - 每个
ConstraintViolation可获取propertyPath(字段路径)、message和invalidValue - 适合处理
@Validated标记的路径参数、表单数据或复杂嵌套校验
确保校验注解生效的前提条件
捕获不到异常,往往不是处理器问题,而是校验根本没触发:
- 确认实体类字段已正确添加 JSR-380 注解(如
@NotBlank、@NotNull),且 message 属性可读 - Controller 方法参数必须同时有
@Valid(或@Validated)和对应载体(@RequestBody/@ModelAttribute) - Spring Boot 2.3+ 已内置
spring-boot-starter-validation,无需额外引入;低版本需显式添加依赖 - 避免在参数后紧跟
BindingResult——一旦写了,Spring 就不会抛异常,而是交由你手动处理,全局捕获失效
返回结构建议:兼顾前端友好与排查效率
不要只返回一句话错误提示,至少包含字段标识和原始值:
- 返回示例:
{"code":400,"message":"参数校验失败","details":[{"field":"phone","value":"123","reason":"手机号格式不正确"}]} - details 字段让前端能精准标红对应输入框,后端日志也可记录完整违规信息
- HTTP 状态码保持 400(Bad Request),符合 REST 规范,网关和前端拦截器能识别
- 如果项目已有统一响应包装类(如
Result<T>),直接复用其 fail 构造方法即可

















