spring boot 默认不支持对 list 或数组的字段级校验,需通过自定义包装类(如 validationlist)或 dto 包装方式实现:前者用 @valid 标记内部 list 字段并代理方法,后者在 dto 中用 @valid 标注 list 字段,均需配合 @validated 和 @requestbody 使用。

Spring Boot 默认不支持直接对 List 或数组类型参数做字段级校验,比如用 @Validated 修饰 @RequestBody List<user></user>,里面的每个 User 对象上的 @NotNull 等注解不会触发。必须通过包装或适配方式让校验框架识别到集合内元素。
用自定义包装类实现集合元素校验
核心思路是:创建一个继承/实现 List 的类,在其内部字段上加 @Valid,使校验器递归检查每个元素。
- 定义泛型包装类,例如
ValidationList<t></t>,内部持有一个List<t></t>字段,并用@Valid标记该字段 - 使用 Lombok 的
@Delegate可自动代理所有List方法(也可手动实现接口) - Controller 方法中用该包装类接收参数,而非原始
List
Controller 层写法示例
确保方法参数使用包装类,并带上 @Validated 和 @RequestBody:
@PostMapping("/users/batch")
public String batchAdd(@Validated @RequestBody ValidationList<user> users) {
// users 中每个 User 的字段都会被校验
return "success";
}</user>
注意:若用了分组校验(如 @Validated(User.Add.class)),需在 ValidationList 的 @Valid 上指定相同分组,例如:@Validated(User.Add.class)。
实体类字段校验写法不变
被校验的元素类型(如 User)仍按常规方式加注解,无需额外改动:
@Data
public class User {
@NotBlank(message = "用户名不能为空")
private String name;
@Email(message = "邮箱格式不正确")
private String email;
}
只要它出现在 ValidationList<user></user> 中,且外层有 @Valid,校验就会生效。
替代方案:用普通对象包装集合
如果不想引入新类,可将数组放在一个 DTO 中,对 DTO 字段加 @Valid:
@Data
public class BatchUserRequest {
@Valid
private List<user> users;
}</user>
然后 Controller 接收该 DTO:
@PostMapping("/users/batch")
public String batchAdd(@Validated @RequestBody BatchUserRequest request) { ... }
这种方式更直观,也便于添加其他批量操作相关字段(如操作人、批次号等)。











