Spring注解之——@Constraint 自定义约束注解

目录

  • 一、@Constraint 注解介绍
  • 二、自定义约束注解
  • 三、自定义校验类

一、@Constraint 注解介绍

@Constraint注解是Java Bean Validation框架中的一个注解,用于自定义约束注解,即自定义校验规则。

通过在自定义注解上添加@Constraint注解,可以将该注解标记为一个自定义约束注解。同时,需要指定一个实现了ConstraintValidator接口的验证器类,用于验证该注解所标记的字段或参数是否符合自定义的校验规则。

@Constraint注解有以下属性:

  1. validatedBy:用于指定实现了ConstraintValidator接口的验证器类。该属性的值是一个Class对象数组,可以指定多个验证器类。

  2. message:用于指定当校验失败时,所返回的错误信息。可以使用占位符{},在校验器中使用具体的参数替换。

  3. groups:用于指定分组,即根据不同的分组应用不同的校验规则。

  4. 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接口,并指定了泛型参数CustomConstraintString。其中,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变量中。通过调用ValidatorvalidatePropertyvalidateParameters方法,可以进行字段和方法参数的校验,校验结果为CustomValidator 对象的Set集合,其中包含了校验不通过的字段或方法参数的详细信息。

你可能感兴趣的:(Spring注解,spring,java,后端)