嵌套对象参数校验默认不生效,必须在字段上加@Valid启用级联校验;Controller方法参数需配合@Valid(@RequestBody)或@Validated(@RequestParam),且嵌套类自身字段须有@NotBlank等约束注解。

在 Spring Boot 中,嵌套对象的参数校验默认不会自动生效,需要显式启用级联校验(Cascade Validation)——即在嵌套字段上添加 @Valid 注解,否则内层对象上的 @NotNull、@Size 等约束会被忽略。
必须在嵌套字段上加 @Valid
Spring Validation 默认只校验当前对象的直接字段,对引用类型(如 DTO 内部的另一个对象)不做递归校验。要让嵌套对象里的校验规则起作用,需在该字段上标注 @Valid:
- 父对象中声明嵌套字段时,在字段前加
@Valid - 若嵌套的是集合(如
List<Item>),则在集合字段上加@Valid,且Item类内部也要有校验注解 -
@Valid是 Bean Validation 标准注解,不是 Spring 特有,但 Spring Boot 的@Validated和@RequestBody自动解析会识别它
Controller 层要配合使用 @Valid 或 @Validated
仅在 DTO 里加 @Valid 不够,Controller 方法参数还需触发校验入口:
- 对
@RequestBody参数,用@Valid(推荐)或@Validated - 对
@RequestParam或@PathVariable,只能用@Validated(因不支持级联,通常不用于嵌套对象) - 错误示例:
public Result save(@RequestBody OrderDTO order)—— 缺少@Valid,嵌套校验不触发 - 正确写法:
public Result save(@Valid @RequestBody OrderDTO order)
确保嵌套对象本身有校验注解
@Valid 只是“打开开关”,真正执行校验依赖嵌套类自身的约束注解:
立即学习“Java免费学习笔记(深入)”;
- 被级联的对象(如
Address)每个需要校验的字段,都得有@NotBlank、@Min等注解 - 若嵌套对象是接口或抽象类,需配合
@Validated分组或自定义验证器 - 注意:Lombok 的
@Data或@AllArgsConstructor不影响校验,但若用了@Builder,需确认构造方式不影响参数绑定(如@RequestBody仍走 setter)
异常统一处理才能看到嵌套校验失败信息
校验失败默认抛出 MethodArgumentNotValidException(@RequestBody)或 ConstraintViolationException(@Validated + 方法参数),需捕获并提取嵌套路径:
- 通过
BindingResult获取所有错误(适用于@Valid+ 方法参数) - 全局异常处理器中,从
FieldError的getField()可拿到类似customer.address.zipCode的嵌套路径 - 避免只返回第一条错误,应遍历所有
bindingResult.getAllErrors()并组装成结构化提示


















