校验不生效需排查依赖、注解路径、参数标注和异常捕获四点:确认引入spring-boot-starter-validation而非javax包;注解必须为jakarta.validation.constraints.*;@valid须直标@requestbody且嵌套/集合字段加@valid;异常必须捕获methodargumentnotvalidexception。

请求体参数校验不生效,不是 @Valid 写错了,而是整个校验链路断在了某个环节。排查要从依赖、注解路径、异常捕获、嵌套结构四个关键点入手,缺一不可。
检查是否引入了正确的校验 starter
Spring Boot 2.3+ 默认移除了 validation 依赖,必须显式添加:
- 确认 pom.xml 中有
<dependency><groupid>org.springframework.boot</groupid><artifactid>spring-boot-starter-validation</artifactid></dependency> - 删掉任何手动引入的
hibernate-validator或validation-api(尤其是javax.validation开头的),避免版本冲突 - 用 IDE 查看依赖树,确保最终只存在
jakarta.validation-api:3.0.x+和org.hibernate.validator:hibernate-validator(由 starter 自动带入)
验证注解导入路径是否为 jakarta
Spring Boot 3.x 起强制使用 Jakarta EE 9+ 规范,javax.validation.* 已彻底失效:
- 所有校验注解必须来自
import jakarta.validation.constraints.* - 常见错误:IDE 自动导入了
javax.validation.constraints.NotBlank,需手动改为jakarta包路径 - DTO 类中字段上的
@NotBlank、@Email、@Size等,都要检查包名
确认 Controller 方法参数是否正确标注 @Valid
@Valid 必须直接作用于 @RequestBody 参数,且不能被其他注解干扰:
- 写法必须是:
public Response add(@Valid @RequestBody UserDTO dto) - 不能写成
@Validated @RequestBody(除非明确需要分组校验) - 若 DTO 内含嵌套对象(如
Address address),需在该字段上额外加@Valid才会级联校验 - 若含集合(如
List<item> items</item>),集合字段本身也要加@Valid,否则内部元素不校验
检查是否捕获了 MethodArgumentNotValidException
@Valid 校验失败时抛出的是 MethodArgumentNotValidException,不是 ConstraintViolationException:
- 若没配全局异常处理器,Spring Boot 默认返回 HTTP 400 + 冗长 JSON,容易误判为“没校验”
- 应编写
@ControllerAdvice拦截该异常,并统一格式化响应(含 code、message、fieldErrors) - 控制台日志里搜
MethodArgumentNotValidException,如果没出现,说明校验根本没触发;如果出现了但没被捕获,说明异常处理器缺失或配置错误











