注解是Hibernate Validator声明式校验的核心,内置如@NotNull、@NotBlank等注解实现快速校验,支持分组校验控制触发时机,并可通过自定义注解(声明+ConstraintValidator实现)满足复杂业务规则。

注解是 Hibernate Validator 实现声明式校验的核心机制,它让校验逻辑与业务代码解耦,既简洁又可复用。关键在于理解注解如何被识别、触发验证、以及如何扩展以满足自定义规则。
内置注解快速上手
Hibernate Validator 提供了常用约束注解,直接加在字段或方法参数上即可生效:
- @NotNull:非 null(不检查空字符串)
- @NotBlank:非 null 且去除首尾空格后长度 > 0(适用于 String)
- @Size(min=1, max=20):适用于 String、Collection、Map、Array,控制长度或元素个数
-
@Email:基础邮箱格式校验(正则为
.*@.*..*,不严格,建议配合自定义) - @Pattern(regexp = "^1[3-9]\d{9}$"):手机号等正则校验
- @Min(18) / @Max(120):仅支持数值类型(int、long、BigDecimal 等)
注意:这些注解默认只对 非 null 值生效;若需对 null 也触发校验(如“必须为 1 或 2”),应组合使用 @NotNull + @Min/@Max 或改用自定义注解。
分组校验(Group Sequencing)控制触发时机
同一字段在不同场景下可能有不同校验要求(如新增时用户名必填,修改时可选但格式仍需合法)。通过校验分组可精准控制:
- 定义空接口作为分组标记:public interface Create {}、public interface Update {}
- 在字段上指定分组:@NotBlank(groups = Create.class)、@Pattern(regexp = "...", groups = {Create.class, Update.class})
- 执行校验时指定分组:validator.validate(user, Create.class)
还可定义顺序分组(GroupSequence),例如先检查基础格式,失败则不执行后续业务规则校验,提升效率。
编写自定义约束注解
当内置注解无法满足业务语义(如“密码不能等于用户名”、“结束时间不得早于开始时间”),需创建自定义注解:
- 声明注解(含 message、groups、payload 等标准属性)
- 实现 ConstraintValidator<YourAnnotation, YourTargetType>,重写 isValid() 方法
- 在注解上用 @Constraint(validatedBy = YourValidator.class) 关联校验器
- 确保校验器无状态(不保存实例变量),线程安全
示例:校验两个字符串字段是否相等(常用于确认密码):
@Target({FIELD})
@Retention(RUNTIME)
@Constraint(validatedBy = FieldMatchValidator.class)
public @interface FieldMatch {
String message() default "字段不匹配";
String first();
String second();
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
对应校验器中通过反射获取两个字段值比对,无需侵入实体逻辑。
验证结果处理与国际化
调用 validator.validate(target) 返回 Set<ConstraintViolation<T>>,每个 violation 包含:
– 失败字段路径(getPropertyPath())
– 错误消息(getMessage(),已支持 EL 表达式如 ${validatedValue})
– 消息模板键(getMessageTemplate())用于 i18n
- 将 ValidationMessages.properties 放入 classpath,并配置 MessageInterpolator 启用多语言
- 注解中的 message 可写成 message = "{user.password.mismatch}",对应 properties 文件中 user.password.mismatch=密码与确认密码不一致
- Spring Boot 中默认自动配置资源绑定,只需添加对应语言的 ValidationMessages_zh_CN.properties
不复杂但容易忽略:错误消息中的占位符(如 ${min})会自动替换注解参数值,利于复用模板。

















