当框架提供的注解不满足于实际开发需求时,需要对其进行扩展。
@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()
:实际验证方法。
@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;
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。