Java自定义注解校验核心是三步:定义注解(含@Constraint指向验证器)、实现ConstraintValidator接口编写isValid逻辑、在字段上使用注解并配合@Valid触发校验。

Java 对象属性的自定义注解校验,核心是结合 javax.validation(Jakarta Bean Validation)规范,通过自定义约束注解 + 对应的约束验证器(ConstraintValidator)来实现。它不是简单加个注解就生效,而是需要三步:定义注解、实现校验逻辑、在字段上使用。
1. 定义自定义约束注解
用 @Target、@Retention、@Constraint 等元注解声明一个运行时可用的校验注解。例如,校验手机号是否符合国内 11 位规则:
@Target({ FIELD })
@Retention(RUNTIME)
@Constraint(validatedBy = PhoneNumberValidator.class)
public @interface PhoneNumber {
String message() default "手机号格式不正确";
Class<?>[] groups() default { };
Class<? extends Payload>[] payload() default { };
}
注意:validatedBy 指向你后续要写的验证器类;message() 支持占位符(如 {value}),也可配合资源文件国际化。
2. 实现 ConstraintValidator 接口
创建一个类实现 ConstraintValidator<PhoneNumber, String>,泛型分别表示注解类型和被校验的字段类型:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
public class PhoneNumberValidator implements ConstraintValidator<PhoneNumber, String> {
@Override
public void initialize(PhoneNumber constraintAnnotation) {
// 可选:读取注解参数,比如支持多国号段配置
}
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
if (value == null || value.trim().isEmpty()) {
return true; // 允许空值(由 @NotBlank 或 @NotNull 控制)
}
return value.matches("1[3-9]\d{9}");
}
}
- 返回 true 表示校验通过;false 表示失败
-
initialize()方法可用于初始化校验器(如读取注解上的额外属性) - 若需动态修改错误消息,可通过
context.buildConstraintViolationWithTemplate()自定义提示
3. 在实体类中使用注解
把自定义注解加到目标字段上,并确保开启校验(如 Spring MVC 中 Controller 参数加 @Valid):
public class User {
@PhoneNumber
private String phone;
@NotBlank
private String name;
// getter/setter...
}
在 Spring Boot 项目中,Controller 方法接收该对象时加上 @Valid 即可触发校验:
@PostMapping("/user")
public ResponseEntity<?> createUser(@Valid @RequestBody User user, BindingResult result) {
if (result.hasErrors()) {
// 处理错误
}
return ResponseEntity.ok().build();
}
4. 进阶技巧(可选但实用)
-
支持多种字段类型:验证器可实现
ConstraintValidator<PhoneNumber, Object>,内部用instanceof分支判断 -
组合注解:用
@ConstraintComposition(Jakarta EE 9+)或嵌套多个标准注解(如@Size+@Pattern)封装常用规则 -
运行时参数化:在注解中定义
String region() default "CN",验证器中读取并切换正则表达式 -
集成 Lombok:配合
@Data和@NoArgsConstructor,不影响校验生效

















