Spring Boot集合参数非空校验需区分null与空集合:@NotEmpty要求字段非null且size>0,作用于DTO具体字段并配合@Valid;@Size(min=1)允许null但拒绝空集合;元素级校验需用@Valid+独立对象。

Spring Boot 中集合类参数的非空校验,核心是区分“不为 null”和“不为空集合”两种需求,并选用对应注解施加在字段上,而非方法参数或整个 DTO 类。
用 @NotEmpty 校验非 null 且 size > 0
@NotEmpty 要求集合既不能为 null,也不能是空集合(如 [] 或 new ArrayList())。它适用于 List、Set、Map、数组和 String。
- 必须作用于 DTO 的具体集合字段,例如:
@NotEmpty private Listtags; - 不能写在
@RequestBody参数上,比如@RequestBody @NotEmpty UserDto dto是错误的——@NotEmpty 不支持自定义对象类型 - 需搭配
@Valid在控制器中触发嵌套校验:@PostMapping("/save") public R save(@Valid @RequestBody UserDto dto)
用 @Size(min = 1) 允许 null 但拒绝空集合
如果业务允许该字段传 null(即不提供该字段),但一旦提供了就必须至少含一个元素,就该用 @Size(min = 1)。
- @Size(min = 1) 只检查集合 size,对 null 值不做限制;而 @NotEmpty 会同时拦截 null 和空集合
- 适合可选字段场景,例如搜索接口中的
filterIds字段:不传可以,传了就不能是空数组
校验集合内每个元素也非空
仅校验集合本身非空还不够。若集合里出现 null 元素(如 ["a", null, "b"]),默认注解不会报错,可能引发后续 NPE。
- 简单字符串列表:可改用
List,但需配合@Valid启用级联校验(注意 Java 泛型擦除限制,实际需封装为独立对象) - 推荐做法:将集合元素类型定义为独立校验对象,例如
@Valid List,并在TagItem中用@NotBlank或@NotNull校验字段
确保基础配置到位
校验生效的前提条件不能遗漏:
- 项目已引入
spring-boot-starter-validation(Spring Boot 2.3+ 默认包含) - Dubbo 或 WebFlux 等非标准 MVC 场景需额外确认校验器是否激活
- 异常统一处理建议配
@RestControllerAdvice捕获MethodArgumentNotValidException,返回友好 JSON 错误信息











