一、@Constraint 注解介绍
@Constraint
注解是Java Bean Validation框架中的一个注解,用于自定义约束注解,即自定义校验规则。
通过在自定义注解上添加@Constraint
注解,可以将该注解标记为一个自定义约束注解。同时,需要指定一个实现了ConstraintValidator
接口的验证器类,用于验证该注解所标记的字段或参数是否符合自定义的校验规则。
@Constraint
注解有以下属性:
-
validatedBy
:用于指定实现了ConstraintValidator
接口的验证器类。该属性的值是一个Class对象数组,可以指定多个验证器类。 -
message
:用于指定当校验失败时,所返回的错误信息。可以使用占位符{},在校验器中使用具体的参数替换。 -
groups
:用于指定分组,即根据不同的分组应用不同的校验规则。 -
payload
:用于指定元数据,即可以通过该属性传递一些额外的验证信息。
使用@Constraint
注解,可以通过自定义注解的方式,为字段或参数添加自定义的校验规则,并实现校验逻辑。这样,在进行参数校验时,可以方便地通过注解的方式来调用自定义的校验规则。
二、自定义约束注解
当我们需要为特定的字段或方法参数添加自定义的校验规则时,可以通过自定义约束注解的方式来实现。下面是一个自定义约束注解的示例:
@Target({ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = CustomValidator.class)
public @interface CustomConstraint {
String message() default "Invalid value";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
上面的代码定义了一个名为 CustomConstraint 的自定义注解,并使用了@Constraint
注解来标记该注解为一个自定义约束注解。其中,@Target
注解指定了该约束注解的作用范围,@Retention
注解指定了该约束注解的生命周期,@Constraint
注解指定了该约束注解所对应的校验器。
三、自定义校验类
接下来,我们需要实现 CustomValidator 类,该类需要实现 CustomValidator 接口,并在validate
方法中编写自定义的校验逻辑。示例如下:
public class CustomValidator implements ConstraintValidator<CustomConstraint, String> {
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
if (value == null) {
return true;
}
// 自定义校验逻辑
return value.length() > 5;
}
}
上面的代码中, CustomValidator 类实现了ConstraintValidator
接口,并指定了泛型参数CustomConstraint
和String
。其中,CustomConstraint
指定了自定义的注解类型,String
指定了要校验的字段或方法参数的类型。在isValid
方法中,我们编写了自定义的校验逻辑,例如校验字符串长度是否大于5等。
最后,我们可以在需要进行校验的字段或方法参数上添加CustomConstraint
注解,并在校验时通过Validator
进行校验。示例如下:
public class CustomClass {
@CustomConstraint
private String field;
public void method(@CustomConstraint String param) {
// 方法体
}
}
Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
CustomClass instance = new CustomClass();
// 针对字段进行校验
Set<ConstraintViolation<CustomClass>> violations = validator.validateProperty(instance, "field");
// 针对方法参数进行校验
Method method = CustomClass.class.getMethod("method", String.class);
Object[] args = new Object[] {"test"};
Set<ConstraintViolation<CustomClass>> violations = validator.forExecutables().validateParameters(instance, method, args);
上面的代码中,我们分别针对CustomValidator 类的field
字段和method
方法的param
参数进行校验,并将校验结果存储在violations
变量中。通过调用Validator
的validateProperty
和validateParameters
方法,可以进行字段和方法参数的校验,校验结果为CustomValidator 对象的Set集合,其中包含了校验不通过的字段或方法参数的详细信息。