深度校验需每层嵌套字段显式标注@Valid,嵌套类字段须有JSR-303注解,集合需用List<@Valid T>语法,且Controller参数必须用@Valid @RequestBody触发。

对嵌套对象做深度参数校验,关键不是“多写几层 if”,而是让校验框架自动递归下去。Spring Boot 中靠 @Valid 驱动级联验证,但必须满足几个硬性条件,缺一不可。
嵌套字段必须显式标注 @Valid
这是触发深度校验的开关。只在 DTO 顶层加 @Valid 不够,每一层需要被校验的引用类型字段都得自己带上 @Valid。
- 比如 OrderDTO 里有 List<OrderItem> items,就得写
@Valid private List<OrderItem> items; - OrderItem 里有 ProductSpec spec,就得写
@Valid private ProductSpec spec; - 如果漏掉某一层的 @Valid,校验就停在那里,内层字段的 @NotBlank、@Min 等注解完全不会执行
嵌套对象自身要有校验注解
@Valid 只是“开门”,门后有没有锁(即约束规则),得看嵌套类里的字段是否配有 JSR-303 标准注解。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- ProductSpec 类中 weight 字段要校验最小值,就得写
@Min(1) private Integer weight; - tags 是 List<String>,想限制最多 5 个,就得写
@Size(max = 5) private List<String> tags; - 没有这些注解,即使加了 @Valid,该字段也等于“不设防”
集合元素校验要配合 Java 8+ 语法
List 或 Set 这类集合字段,光写 @Valid 只能校验集合本身(比如是否为 null),不能自动校验每个元素。要穿透到每个 item,需用泛型标注语法:
- 正确写法:
private List<@Valid OrderItem> items; - 旧写法
@Valid private List<OrderItem> items;在较新版本中可能失效,尤其搭配 Spring Boot 3.x + Jakarta Validation 3.0 时 - 若元素类型是可空引用(如
List<@Valid ProductSpec>中某个元素为 null),默认会跳过该校验;如需严格检查,可额外加@NotNull或自定义逻辑
控制器入口必须启用校验机制
@Valid 在字段上只是“声明”,真正启动整条校验链,还得靠 Controller 方法参数上的驱动注解:
- POST 接口接收 JSON body,必须写
@Valid @RequestBody OrderDTO order - 不能只写 @RequestBody,否则所有 @Valid 都不会生效
- 项目需引入
spring-boot-starter-validation依赖,否则编译可能通过,运行时报 NoClassDefFoundError

















