当框架提供的注解不满足于理论开发需要时,须要对其进行扩大。
@Target
:指定注解能够用于:字段、注解、参数。
ElementType
选项阐明:
CONSTRUCTOR:用于形容结构器FIELD:用于形容域LOCAL_VARIABLE:用于形容局部变量METHOD:用于形容办法PACKAGE:用于形容包PARAMETER:用于形容参数TYPE:用于形容类、接口(包含注解类型) 或enum申明
@Retention
:指定生命周期。
RetentionPolicy
阐明:
SOURCE:在源文件中无效(源文件保留)CLASS:在class文件中无效(class保留)RUNTIME:在运行时无效(运行时保留)
@Documented
: 使得该注解 javadoc工具记录
@Constraint
:指定验证器,实现类。~~~~
groups()
和payload()
是自定义效验注解必须的内容。
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()
:理论验证办法。
@Slf4jpublic 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; }}