携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第11天,点击查看活动详情
前面我们讲解了注解实现参数的校验,这篇文章我们具体的了解一下,如何自定义我们自己的注解。来完整实现自定义注解并使用!
我们这里实现一个常用的校验,身份证信息的校验
@Target({ ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = IdentityConstraintValidator.class)
public @interface IdentityNo {
String message() default "身份证号码不符合规则";
Class<?>[] groups() default { };
Class<? extends Payload>[] payload() default { };
}
我们自定义注解IdentityNo,磨人的提示信息是“身份证号码不符合规则”,
@Retention: 指定注解的生命周期(源码、class文件、运行时),我们这里标注的是运行时的处理方式,
● RetentionPolicy .SOURCE : 在编译阶段丢弃。这些注解在编译结束之后就不再有任何意义,所以它们不会写入字节码。@Override, @SuppressWarnings都属于这类注解。
● RetentionPolicy .CLASS : 在类加载的时候丢弃。在字节码文件的处理中有用。注解默认使用这种方式。
● RetentionPolicy .RUNTIME : 始终不会丢弃,运行期也保留该注解,因此可以使用反射机制读取该注解的信息。我们自定义的注解通常使用这种方式。
@Target:指定注解使用的目标范围(类、方法、字段等),我们选择的是FIELD
● ElementType.CONSTRUCTOR : 用于描述构造器。
● ElementType.FIELD : 成员变量、对象、属性(包括enum实例)。
● ElementType.LOCAL_VARIABLE: 用于描述局部变量。
● ElementType.METHOD : 用于描述方法。
● ElementType.PACKAGE : 用于描述包。
● ElementType.PARAMETER :用于描述参数。
● ElementType.ANNOTATION_TYPE:用于描述参数
● ElementType.TYPE : 用于描述类、接口(包括注解类型) 或enum声明。
@Constraint:(validatedBy = IdentityConstraintValidator.class)指定了我们的具体实现类如下
package com.zhaoxingban.www.common.validate.validator;
import com.zhaoxingban.www.common.validate.annotation.IdentityNo;
import org.springframework.util.StringUtils;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.regex.Pattern;
public class IdentityConstraintValidator implements ConstraintValidator<IdentityNo, String> {
@Override
public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {
return check(s);
}
private static final String REGEX_ID_CARD18 = "^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9Xx])$";
private boolean check(String idno){
return StringUtils.hasText(idno) ? Pattern.matches(REGEX_ID_CARD18,idno) : true;
}
}
一个自定义的注解大概就是这么个步骤实现,这里我们的身份证校验注解即完成了!
喜欢,请关注公众号《coder练习生》