springboot 自定義校驗註解

當框架提供的註解不知足於實際開發需求時,須要對其進行擴展。java

@Target :指定註解能夠用於:字段、註解、參數。正則表達式

  • ElementType選項說明:
CONSTRUCTOR:用於描述構造器
FIELD:用於描述域
LOCAL_VARIABLE:用於描述局部變量
METHOD:用於描述方法
PACKAGE:用於描述包
PARAMETER:用於描述參數
TYPE:用於描述類、接口(包括註解類型) 或enum聲明

@Retention :指定生命週期。框架

  • RetentionPolicy 說明:
SOURCE:在源文件中有效(源文件保留)
CLASS:在class文件中有效(class保留)
RUNTIME:在運行時有效(運行時保留)

@Documented: 使得該註解 javadoc工具記錄ide

@Constraint :指定驗證器,實現類。~~~~工具

groups()payload()是自定義效驗註解必須的內容。code

List接口是可選的,同一個效驗註解在一個字段使用屢次,須要使用@List接口

簡單舉例:生命週期

  • 校驗註解
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(validatedBy = SizeValidator.class)
public @interface SizeValid {
    //錯誤提示信息,必須存在
    String message() default "";
    
    long max();
    
    long min() default 0;

    //分組,必須存在
    Class<?>[] groups() default {};

    //負載,必須存在
    Class<? extends Payload>[] payload() default {};

    //多個分組時使用
    @Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    public @interface List {
        SizeValid[] value();
    }
}
  • 實現類

ConstraintValidator<A, T>接口: A是自定義效驗註解,T是支持效驗的數據類型。
initialize():初始化驗證器相關內容。
isValid():實際驗證方法。開發

@Slf4j
public class SizeValidator implements ConstraintValidator<SizeValid, String> {

    private long min;
    private long max;
    /**匹配雙字節字符正則表達式*/
    private static final String REGEX = "[^\\x00-\\xff]";

    /**
     * 獲取註解屬性的值
     *
     * @param constraintAnnotation
     */
    @Override
    public void initialize(NameValid constraintAnnotation) {
        min = constraintAnnotation.min();
        max = constraintAnnotation.max();
    }

    /**
     * @param value
     * @param context
     * @return 是否經過驗證
     */
    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        if(value == null) return true;
        long length = value.replaceAll(REGEX, "aa").length();
        return min <= length && max >= length;
    }
}
相關文章
相關標籤/搜索