@groupsequence是java bean validation中用于控制校验组执行顺序的核心注解,支持顺序执行、兜底校验、嵌套序列及与@validated联动,实现多场景分组校验。

分组校验是 Java Bean Validation 中处理不同业务场景下字段校验逻辑的关键机制,@GroupSequence 是实现“校验顺序控制”和“组合分组”的核心注解。它本身不定义校验规则,而是指定多个校验组的执行顺序,并支持在前一组失败时跳过后续组(默认行为),从而实现更精细的校验流程控制。
基础用法:定义校验组执行顺序
当你有一组校验逻辑需要按优先级或阶段执行(例如先检查必填,再检查格式,最后检查业务约束),就可以用 @GroupSequence 定义顺序:
- 定义多个空接口作为校验组,如
Create、Update、BusinessCheck - 新建一个序列接口,用
@GroupSequence({Create.class, Update.class, BusinessCheck.class})标注 - 在实体类字段上用
@NotBlank(groups = Create.class)、@Email(groups = Update.class)等标注归属 - 校验时传入该序列接口(而非单个组),框架会按顺序逐组执行,一旦某组有错误,后续组默认不再执行
配合 Default 分组实现“兜底校验”
很多字段默认就带 @NotNull 等无 group 的约束,它们属于 Default 组。若想让 Default 校验总在最前执行(比如先确保基础非空,再走业务流),可这样组织:
- 定义序列:
@GroupSequence({Default.class, Create.class, BusinessCheck.class}) - 此时即使你没显式给某个
@NotNull指定groups = Default.class,它也会被自动纳入第一轮校验 - 特别适合统一基础校验 + 场景特化校验的混合模型
嵌套序列:复用与分层编排
@GroupSequence 支持嵌套——序列接口自身也可以作为另一个序列的元素,实现模块化编排:
- 定义
UserBasicChecks.class序列(含 NameCheck、EmailCheck) - 定义
UserAdvancedChecks.class序列(含 PhoneCheck、RoleCheck) - 顶层序列:
@GroupSequence({UserBasicChecks.class, UserAdvancedChecks.class}) - 这样便于团队协作:不同模块维护自己的子序列,主流程只需组合调用
与 @Valid 和级联校验联动
当对象包含嵌套对象(如 User 包含 Address),且希望级联校验也遵循分组顺序时:
- 在嵌套字段上使用
@Validated({UserSequence.class})(注意不是@Valid,因为@Valid不支持指定组) - 确保嵌套类(如
Address)也定义了对应分组和约束,并参与同一序列或子序列 - Spring MVC 中可直接在 Controller 方法参数上写
@Validated(UserSequence.class) User user,自动触发整条链路的有序校验
关键点在于:序列不是运行时动态决定的,而是在编译期静态声明;它解决的是“哪些组按什么顺序跑”,而不是“该不该跑”。真正启用哪一组,仍由你调用 validator.validate(target, Group.class) 时传入的类型决定。用对了,就能让注册、修改、审核等场景各走各的校验路径,互不干扰又逻辑清晰。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











