
在 Spring Boot 中,仅用 @NonNull 无法校验 List 字段是否为空;需结合 @NotEmpty(作用于集合本身)或 @Size(min = 1) 等 Bean Validation 注解,并确保控制器方法参数正确应用校验注解。
在 spring boot 中,仅用 `@nonnull` 无法校验 `list` 字段是否为空;需结合 `@notempty`(作用于集合本身)或 `@size(min = 1)` 等 bean validation 注解,并确保控制器方法参数正确应用校验注解。
要让 Spring Boot 拒绝包含空列表(如 "route": [])的请求体,关键在于将校验注解施加在 List 字段上,而非整个 DTO 类上——原答案中建议的 @RequestBody @NotEmpty BodyDto 是错误的:@NotEmpty 不能直接用于自定义对象类型(BodyDto),它仅适用于 String、Collection、Map、Array 等可判空类型,对 BodyDto 无意义,且会导致编译错误或运行时忽略。
✅ 正确做法是:在 BodyDto 的 route 字段上使用 @NotEmpty(来自 jakarta.validation.constraints 或 javax.validation.constraints),并确保已启用全局校验(Spring Boot 默认已启用):
import jakarta.validation.constraints.NotEmpty; // Jakarta EE 9+(Spring Boot 3.x)
// 或 import javax.validation.constraints.NotEmpty; // Java EE / Spring Boot 2.x
@Getter
@Setter
@AllArgsConstructor
public class BodyDto {
@NotEmpty(message = "route must not be empty")
private List<String> route;
}同时,控制器方法必须保留 @Valid(或 @Validated),因为 @RequestBody 本身不触发嵌套校验:
@PostMapping("/example")
public ResponseEntity<BodyDto> example(@Valid @RequestBody BodyDto bodyDto) {
return ResponseEntity.ok(bodyDto);
}⚠️ 注意事项:
- @NotEmpty 要求集合非 null 且 size() > 0;若允许 null 但禁止空列表,应改用 @Size(min = 1)。
- 若需更精细控制(如同时校验元素非空),可叠加 @NotEmpty 在 List<String> 上,并配合 @NotBlank 作用于泛型元素(需启用级联校验,即 @Valid + List<@NotBlank String>,但 Java 不支持直接修饰泛型类型,需封装为 @Valid List<RouteItem>)。
- 确保项目依赖包含 spring-boot-starter-validation(Spring Boot 2.3+ 已默认包含)。
- 错误响应默认返回 400 Bad Request 及详细校验信息(如启用 @ControllerAdvice 可统一格式化)。
✅ 示例测试:
- ✅ 有效请求:{"route":["A","B"]} → 200 OK
- ❌ 无效请求:{"route":[]} → 400 + "route must not be empty"
- ❌ 无效请求:{"route":null} → 400(因 @NotEmpty 同时校验非空与非 null)
总结:校验空列表的核心是 @NotEmpty(或 @Size(min = 1))标注在 List 字段上 + @Valid 启用方法级校验,而非错误地将其应用于 DTO 类型参数。


















