ConstraintValidator 接口的实现类才是自定义校验器的执行主体,它通过 initialize() 初始化参数、isValid() 执行校验逻辑,并需用泛型约束字段类型、@Component 注册到 Spring 容器,且注解须通过 @Constraint(validatedBy = Xxx.class) 显式绑定。

Java 中接口本身不直接定义校验逻辑,真正承载核心校验行为的是 ConstraintValidator 接口的实现类。它才是自定义校验器的执行主体。
ConstraintValidator 是校验行为的实际执行者
这个接口定义了两个关键方法:
- initialize():在验证开始前被调用一次,用于读取注解上的配置(如 min、max、正则表达式等),并初始化校验所需参数
- isValid():对具体字段值进行判断,返回 true(通过)或 false(失败)。所有业务规则都写在这里
泛型约束决定了校验器能用在哪类字段上
声明时必须明确两个泛型参数:ConstraintValidator<MyAnnotation, String>
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 第一个泛型是自定义注解类型(如
@Phone) - 第二个泛型是该注解所标注的字段类型(如
String、Integer、LocalDateTime) - 如果字段是
String,但校验器声明为ConstraintValidator<MyAnn, Integer>,运行时会跳过校验或报错
校验器必须被 Spring 容器管理才能生效
仅实现接口还不够,Spring 的 LocalValidatorFactoryBean 需要扫描到它:
立即学习“Java免费学习笔记(深入)”;
- 加
@Component注解,确保被组件扫描识别 - 若使用多模块或自定义包路径,需确认
@ComponentScan覆盖该类所在包 - 未被扫描到会导致启动异常:
No validator could be found for constraint
注解与校验器之间靠 @Constraint(validatedBy = Xxx.class) 绑定
自定义注解不是孤立存在的,它必须显式关联一个 ConstraintValidator 实现:
- 注解定义中必须包含
@Constraint(validatedBy = PhoneValidator.class) - 且该注解自身要声明标准三要素:
message()、groups()、payload() - 缺少
validatedBy或指向错误类,注解就只是个标记,不会触发任何校验

















