Spring Boot嵌套对象参数级联校验需在嵌套字段上显式添加@Valid注解,配合目标类自身约束注解(如@NotBlank、@Min)才能触发递归验证;集合类型需在字段上加@Valid并可结合@Size控制非空,Controller中须用@RequestBody或@ModelAttribute配合@Valid方可激活校验链条。

Spring Boot 中嵌套对象的参数级联校验,核心是靠 @Valid 注解触发递归验证。只要在字段上加了 @Valid,Spring 就会自动进入该对象内部,检查它自身声明的所有约束(比如 @NotBlank、@Min 等),而不需要手动一层层写 if 判断。
必须在嵌套字段上加 @Valid
这是级联生效的前提。仅在最外层 DTO 上加 @Valid 不够,内层对象字段也得显式标注:
- 普通嵌套对象:字段类型是另一个 JavaBean,直接在该字段上加 @Valid
- 集合类型(List/Set):@Valid 要加在集合字段上,Spring 会逐个校验每个元素
- 数组、Map 等容器同理,但需注意 Map 的 value 类型若为 Bean,也要确保其类本身有约束注解
被嵌套的类要自带校验规则
@Valid 只是“开门”,门后有没有规则要看目标类自己是否定义了约束注解:
- OrderItem 类里有 @Pattern(regexp = "^[A-Z]{3}\d{6}$") skuCode,这个规则才会在校验 OrderDTO.items 时被触发
- 如果 ProductSpec 没有 @Min 或 @Size,哪怕加了 @Valid,也不会报错
- Lombok 的 @Data 不影响校验,但记得提供 getter(Hibernate Validator 需通过 getter 访问字段)
集合校验要注意空与非空语义
集合字段本身可为空,但你往往需要控制“集合不为空”或“集合里的每个元素都合法”:
- 用 @Size(min = 1) 控制 List 不能为空
- 用 @Valid 保证每个元素都走自己的校验逻辑
- 两者可以共存:@Valid @Size(min = 1) private List
questions; - 元素允许为 null?默认不校验 null 元素;如需校验,得配合 @NotNull 在集合元素类型中声明
Controller 层调用要配对使用
只加 @Valid 不够,方法参数还得配合 @RequestBody 或 @ModelAttribute 才能激活整个链条:
- @PostMapping("/order") public Result create(@RequestBody @Valid OrderDTO dto)
- 错误时抛出 MethodArgumentNotValidException,可用 @RestControllerAdvice 统一捕获并返回友好提示
- 不要混用 @Validated —— 它不支持嵌套校验,@Valid 才是级联验证的唯一标准注解











