初级mvc中集合参数校验本质是声明式规则校验,非独立过滤机制:需用@valid配合元素级注解、@notempty校验集合非空、分组校验适配场景、@restcontrolleradvice统一处理错误。

在初级 MVC 脚手架(如 Spring Boot + Spring MVC)中,“集合过滤”并不是一个标准术语,也不存在专用于集合的独立“过滤机制”来实现参数校验。实际开发中,所谓“对集合参数做校验”,本质是对 @RequestBody List<t></t> 或 @RequestBody Set<t></t> 等集合类型入参,结合 JSR-303 注解与框架绑定规则完成强校验,而非通过 Filter 或自定义流处理来“过滤集合”。
真正可行、简洁、符合初级项目能力的方式如下:
用 @Valid 配合集合元素级注解
Spring 支持对泛型集合中的每个元素递归校验,前提是:
- 集合字段本身或其泛型类型标注
@Valid - 元素类型(如
UserRequest)内部已定义校验规则
例如:
@PostMapping("/orders")
public Result createOrders(@Valid @RequestBody List orders) {
// ...
}
其中 OrderRequest 类字段已加 @NotBlank、@Min 等注解。这样每个 OrderRequest 实例都会被单独校验。
校验空集合与空元素
集合本身是否为空、元素是否为 null,需搭配合适注解:
-
@NotEmpty:校验集合非 null 且 size > 0(适用于List、Set、Map、String) -
@NotNull:仅判 null,不判空集合或空字符串 -
@Size(min = 1):等效于@NotEmpty,语义更明确
注意:@NotEmpty 必须作用于集合字段本身(如 DTO 中的 List<orderrequest> items</orderrequest>),不能只写在 Controller 参数上。
分组校验适配不同场景
新增和修改常需不同校验逻辑(如新增不校验 id,修改必须有 id):
- 定义校验组接口:
public interface Create {}、public interface Update {} - 在字段上指定组:
@Null(groups = Create.class) @NotNull(groups = Update.class) private Long id;
- Controller 中按需启用:
@PostMapping("/batch") public Result save(@Validated(Create.class) @RequestBody List<orderrequest> list)</orderrequest>
统一捕获并响应校验错误
避免默认 400 响应,推荐用 @RestControllerAdvice 全局处理:
- 捕获
MethodArgumentNotValidException - 提取
BindingResult中所有错误信息 - 返回结构化 JSON(如
{ "code": 400, "message": "订单数量不能小于1" })
无需在 Filter 层解析 JSON 或遍历集合——那会破坏流复用、绕过框架校验链,且极易出错。
本质上,集合参数校验不是“过滤”,而是声明式规则 + 框架自动遍历执行。把校验逻辑写在模型里,比在拦截器里手动 for 循环判断更安全、可测、可维护。











