关于自定义验证

请查看基础知识: 基础.md

@Constraint

主要作用就是帮助我们来处理验证逻辑的,指定使用什么验证器处理。

@Documented
@Target({ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Constraint {
    Class<? extends ConstraintValidator<?, ?>>[] validatedBy();
}

ConstraintValidator接口

public interface ConstraintValidator<A extends Annotation, T> {
    default void initialize(A constraintAnnotation) {
    }

    boolean isValid(T var1, ConstraintValidatorContext var2);
}
  • ConstraintValidator 是一个接口,接受两个泛型。
  1. 接受的注解类
  2. 校验的数据类型
  • 提供两个方法。
    • default void initialize(A constraintAnnotation) {}。初始化一些数据信息。
    • boolean isValid(T var1, ConstraintValidatorContext var2);。传递两个参数,第一个是数据信息,第二个上下文信息。验证通过则返回TRUE

手机号正则校验注解

  1. 创建注解 @PhoneNumber

    /**
     * 手机号校验
     */
    @Documented
    @Constraint(
            validatedBy = {PhoneNumberValidator.class}
    )
    @Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
    @Retention(RetentionPolicy.RUNTIME)
    public @interface PhoneNumber {
        // 提示信息
        String message() default "电话号码格式不正确";
    
        Class<?>[] groups() default {};
    
        Class<? extends Payload>[] payload() default {};
    }
    
    
  2. 创建类 PhoneNumberValidator 实现校验接口 ConstraintValidator

    /***
     * phoneNumber 校验器
     */
    public class PhoneNumberValidator implements ConstraintValidator<PhoneNumber, String> {
        private static final Pattern PATTERN = Pattern.compile(^1[3|4|5|6|7|8|9][0-9]\d{8}$);
    
        @Override
        public void initialize(PhoneNumber constraintAnnotation) {
            ConstraintValidator.super.initialize(constraintAnnotation);
        }
        @Override
        public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext) {
            if (value != null) {
                Matcher matcher = PATTERN.matcher(value);
                return matcher.find();
            }
            return true;
        }
    }
    
  3. 使用

    @NotBlank(message = "请填写手机号")
    @PhoneNumber
    private String mobile;