需在嵌套属性上显式添加@valid注解并确保其类型内部有jsr校验注解,集合字段同样适用;控制器参数须配合@valid/@validated与bindingresult,且项目需引入spring-boot-starter-validation依赖。

在 Java 中,实体类属性要触发级联校验(即校验其内部嵌套对象的约束),需在该属性上添加 @Valid 注解,同时确保嵌套类自身也定义了 JSR-303/380 校验注解(如 @NotBlank、@NotNull 等)。
必须在嵌套属性上显式加 @Valid
Spring 或 Hibernate Validator 不会自动递归校验对象内部字段。只有被 @Valid 标记的字段,才会触发对其所引用对象的约束校验。
- 若属性是单个对象(如
UserProfile profile),直接在字段或 getter 上加@Valid - 若属性是集合(如
List<address> addresses</address>),@Valid要加在集合字段上,Validator 会遍历每个元素并校验其约束 - 注意:
@Valid本身不定义规则,只开启级联;真正起效的是嵌套对象上的校验注解
嵌套类必须有校验注解
@Valid 只是“开关”,真正校验逻辑来自被校验对象自身的注解。如果 Profile 类里没有 @NotBlank、@Min 等,即使加了 @Valid 也不会报错。
- 示例:
Profile类中需有@NotBlank(message = "昵称不能为空") private String nickname; - 嵌套类无需额外继承或实现接口,只要它是普通 Java Bean 即可
- 建议为嵌套类单独提取校验逻辑,便于复用和测试
Controller 层需启用校验机制
仅加注解还不够,控制器方法参数必须配合 @Valid 或 @Validated,且使用 BindingResult 捕获结果(否则校验失败会抛 MethodArgumentNotValidException)。
- 正确写法:
public ResponseEntity> save(@Valid @RequestBody User user, BindingResult result) - 若用
@Validated,支持分组校验,但级联行为与@Valid一致 - 确保项目已引入
spring-boot-starter-validation(Spring Boot 2.3+ 默认不包含,需显式添加)
常见陷阱与注意事项
级联校验看似简单,但几个细节容易导致失效:
-
属性为 null 时,@Valid 不触发任何校验 —— 这是默认行为,如需校验非空,需额外加
@NotNull - 集合元素为
null项时,@Valid会跳过该校验(不会报 NPE),但整个集合仍可加@NotEmpty控制 - Lombok 的
@Data或@Setter不影响校验,但若用了@Builder且构造方式绕过 setter,需确认对象确实被完整赋值 - 自定义注解 +
@Valid组合使用时,确保验证器(ConstraintValidator)未屏蔽级联逻辑
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











