當框架提供的註解不知足於實際開發需求時,須要對其進行擴展。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; } }