Spring中@Validated分组校验需定义空标记接口(如AddGroup)、在字段注解中通过groups指定分组、Controller参数用@Validated(XXX.class)触发对应校验,支持多组复用同一DTO、嵌套对象级联校验。

在 Spring 中使用 @Validated 实现分组校验,核心是定义校验组接口、在实体类字段上用 @NotBlank(groups = XXX.class) 指定组、并在 Controller 方法参数上用 @Validated(XXX.class) 触发对应组的校验。
定义校验组接口
校验组本质是空的标记接口,用于逻辑分组,不需实现任何方法:
public interface AddGroup {}
public interface UpdateGroup {}
public interface QueryGroup {}
不同组可复用同一实体类,避免为不同场景写多套 DTO。
在实体类中按组声明校验规则
把校验注解的 groups 属性指向对应组接口。未指定 groups 的注解默认属于默认组(无参校验时触发):
public class UserDTO {
@NotNull(groups = UpdateGroup.class)
private Long id;
@NotBlank(groups = {AddGroup.class, UpdateGroup.class})
private String username;
@Email(groups = AddGroup.class)
private String email;
@Min(value = 0, groups = QueryGroup.class)
private Integer age;
// getter/setter...
}
注意:@NotBlank 可同时属于多个组;@Email 只在新增时校验;@Min 仅查询分页参数时生效。
Controller 中按需启用指定组校验
在方法参数前用 @Validated(XXX.class),Spring 就只校验该组标注的字段:
@PostMapping("/user")
public Result add(@Validated(AddGroup.class) @RequestBody UserDTO dto) {
userService.save(dto);
return Result.ok();
}
@PutMapping("/user")
public Result update(@Validated(UpdateGroup.class) @RequestBody UserDTO dto) {
userService.update(dto);
return Result.ok();
}
@GetMapping("/users")
public Result list(@Validated(QueryGroup.class) UserQuery query) {
return Result.ok(userService.list(query));
}
若校验失败,Spring 默认返回 400 并携带 BindingResult 或抛出 MethodArgumentNotValidException,可全局捕获统一处理。
支持嵌套对象与级联校验
对关联对象启用级联校验,只需在字段上加 @Valid 注解(注意不是 @Validated),它会自动沿用外层的分组:
public class OrderDTO {
@Valid // 启用级联
private Address address;
@NotBlank(groups = AddGroup.class)
private String orderId;
}
public class Address {
@NotBlank(groups = AddGroup.class)
private String province;
}
当 @Validated(AddGroup.class) 作用于 OrderDTO 时,Address.province 的 AddGroup 校验也会被触发。











