java集合校验需分两层:先用@notnull、@notempty、@size校验容器本身,再用@valid配合元素内约束校验每个元素;基本类型集合需用类型注解;手动校验可补充唯一性、非空、自定义规则等场景。

Java 中集合参数的有效性校验需分两层处理:一是集合容器本身是否合法(非 null、非空、大小合规),二是集合内每个元素是否满足业务规则。不能只校验“有没有”,还要校验“对不对”。
校验集合容器状态
使用 JSR-303/JSR-380 标准注解直接作用于集合字段:
-
@NotNull:确保集合引用不为 null(如
List<user> users</user>本身不是 null) - @NotEmpty:进一步要求集合不为 null 且 size > 0(适用于 List、Set、Map、数组)
- @Size(min = 1, max = 100):精确控制元素数量范围,比 @NotEmpty 更细粒度
示例:
@NotEmpty(message = "用户列表不能为空") @Size(max = 50, message = "最多支持50个用户批量操作") private List users;
校验集合内每个元素
仅加 @NotEmpty 不会检查 List 里每个 User 是否合法。必须配合 @Valid 实现深度验证:
- 在集合字段上标注 @Valid(如
@Valid List<user></user>),触发对每个元素的递归校验 - User 类内部需定义字段级约束(如
@NotBlank private String name;) - 若集合元素是基本类型(如
List<string></string>),需用 类型注解(JDK 8+):List,并确保 Hibernate Validator ≥ 6.0
手动校验与工具类补充
框架注解无法覆盖全部场景时,可辅以代码逻辑:
- 检查元素唯一性:
new HashSet(list).size() == list.size() - 过滤 null 元素:
list.stream().noneMatch(Objects::isNull) - 自定义规则校验:
list.stream().allMatch(u -> u.getAge() >= 18) - 封装通用方法:
ValidatorUtils.validateCollection(list, User::isValid)
Controller 层正确触发校验
Spring Boot 中必须显式启用验证,否则注解无效:
- 在 @RequestBody 参数前加 @Valid 或 @Validated
- 捕获
MethodArgumentNotValidException统一处理错误信息 - 避免仅依赖 @NotNull 检查集合引用,忽略元素内容——这是最常见的疏漏
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











