
在 Spring Boot 中,仅用 @NonNull 无法校验 List 是否为空;需结合 @NotEmpty(作用于字段)或自定义校验逻辑,确保 @RequestBody 中的集合字段既非 null 也非空。
在 spring boot 中,仅用 `@nonnull` 无法校验 `list` 是否为空;需结合 `@notempty`(作用于字段)或自定义校验逻辑,确保 `@requestbody` 中的集合字段既非 null 也非空。
要使 BodyDto.route 字段既不能为 null,也不能是空列表([]),关键在于正确使用 Jakarta Bean Validation(原 javax.validation)注解,并确保校验生效。
✅ 正确做法:在字段上使用 @NotEmpty
@NotEmpty 是 Hibernate Validator 提供的扩展注解(属于 jakarta.validation.constraints 或旧版 javax.validation.constraints),它要求目标对象不为 null 且长度 > 0 —— 对 List
修改 BodyDto 如下:
import jakarta.validation.constraints.NotEmpty; // 注意:Spring Boot 3+ 使用 jakarta.*
import lombok.Getter;
import lombok.Setter;
import lombok.AllArgsConstructor;
@Getter
@Setter
@AllArgsConstructor
public class BodyDto {
@NotEmpty(message = "route must not be null or empty")
private List<string> route;
}</string>
⚠️ 注意版本兼容性:
- Spring Boot 2.x 默认使用 javax.validation → 导入 javax.validation.constraints.NotEmpty
- Spring Boot 3.x+ 迁移至 Jakarta EE 9+ → 必须使用 jakarta.validation.constraints.NotEmpty
同时确保项目中已引入验证依赖(Spring Boot Web 已默认包含)。
✅ 控制器保持 @Valid(推荐写法)
控制器无需将 @NotEmpty 放在 @RequestBody 上(该写法无效且语义错误)——@NotEmpty 必须作用于 DTO 的具体字段,而 @Valid 触发其递归校验:
@PostMapping("/example")
public ResponseEntity<bodydto> example(@Valid @RequestBody BodyDto bodyDto) {
return ResponseEntity.ok(bodyDto);
}</bodydto>
此时,以下请求将触发 400 Bad Request 响应,并返回标准校验错误(如 "route must not be null or empty"):
{ "route": [] }
而以下请求均合法:
{ "route": ["A", "B"] } // ✅ 非空列表
// { "route": null } // ❌ 会被 @NotEmpty 拒绝(null 不满足)
// { "route": "abc" } // ❌ 类型不匹配,JSON 解析失败(400)早于校验
? 补充说明与常见误区
- ❌ @Size(min = 1) 也可实现类似效果,但 @NotEmpty 语义更精准、可读性更强;
- ❌ @NotNull 仅防 null,不防空集合;
- ❌ @Valid 加在 @RequestBody 参数上是必须的,否则字段级注解不会生效;
- ✅ 若需全局统一处理校验异常,建议添加 @ControllerAdvice 捕获 MethodArgumentNotValidException 并返回结构化错误响应。
✅ 总结
要强制 List 字段非空,只需两步:
- 在 DTO 字段上添加 @NotEmpty(注意 Jakarta / javax 包路径);
- 在控制器方法参数中保留 @Valid @RequestBody。
无需额外配置,Spring Boot 的自动配置会启用验证器并拦截非法请求。











