@Constraint
是 Java 中用于定义自定义校验注解的一个元注解。它通常与 Hibernate Validator 或其他基于 JSR 380(Bean Validation 2.0)的校验框架一起使用。通过 @Constraint
注解,你可以创建自己的校验逻辑,并将其应用到实体类的字段上
1. 创建自定义校验注解
首先,定义一个自定义校验注解。假设我们想创建一个注解 @ValidLength
,用于校验字符串的最大长度为20位。
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Constraint(validatedBy = ValidLengthValidator.class)
@Target({ ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.PARAMETER })
@Retention(RetentionPolicy.RUNTIME)
public @interface ValidLength {
String message() default "长度必须在1到20个字符之间";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
int min() default 1;
int max() default 20;
}
2. 创建校验器
接下来,创建一个实现 ConstraintValidator
接口的类,用于实现具体的校验逻辑。
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
public class ValidLengthValidator implements ConstraintValidator<ValidLength, String> {
private int min;
private int max;
@Override
public void initialize(ValidLength constraintAnnotation) {
this.min = constraintAnnotation.min();
this.max = constraintAnnotation.max();
}
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
if (value == null) {
return true; // 允许为空
}
return value.length() >= min && value.length() <= max;
}
}
3. 应用自定义校验注解
在实体类中使用自定义校验注解。
import javax.validation.constraints.NotNull;
public class User {
@NotNull
@ValidLength(min = 1, max = 20)
private String username;
// Getters and Setters
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
}
4. 测试校验
编写一个测试类来验证校验逻辑是否按预期工作。
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
import javax.validation.ConstraintViolation;
import java.util.Set;
public class Main {
public static void main(String[] args) {
User user = new User();
user.setUsername("12345678901234567890"); // 20位,合法
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();
Set<ConstraintViolation<User>> violations = validator.validate(user);
for (ConstraintViolation<User> violation : violations) {
System.out.println(violation.getMessage());
}
if (violations.isEmpty()) {
System.out.println("校验通过");
} else {
System.out.println("校验失败");
}
}
}
输出
运行上述代码后,如果 username 的长度在1到20个字符之间,输出将是:
校验通过
如果 username 的长度超过20个字符或小于1个字符,输出将是:
长度必须在1到20个字符之间
校验失败
总结
- 自定义校验注解:使用
@Constraint
注解定义自定义校验注解。 - 校验器:实现
ConstraintValidator
接口,编写具体的校验逻辑。 - 应用注解:在实体类的字段上使用自定义校验注解。
- 测试校验:使用
Validator
对象进行校验,并处理校验结果。