自定义注解
自定义注解主要依赖以下几个注解。
@Target(用于描述修饰对象的范围)
范围取值ElementType这个枚举类。
ANNOTATION_TYPE(注释类型声明)
FIELD (字段声明)
METHOD (方法声明)
PARAMETER(参数声明)
@Retention (注释类型的注释要保留多久)
RUNTIME 编译器将把注释记录在类文件中,在运行时 JVM 将保留注释,因此可以通过反射读取
@Constraint(这个注解的主要作用就是帮助我们来处理验证逻辑的,约束注解)
@Document(进行文档转化)
自定义注解用 @interface修饰
内部主要实现注解功能,我这个注解是用来验证字符串时候匹配的。
下面是验证注解实现
package config;
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
//
@Target({FIELD,METHOD,PARAMETER,ANNOTATION_TYPE})
@Retention(RUNTIME)
//指定验证器
@Constraint(validatedBy = ForbiddenValidator.class)
@Documented
public @interface Forbidden {
//默认错误信息
String message() default "{fordidden.word}";
//分组
Class<?>[] groups() default { };
//负载
Class<? extends Payload>[] payload() default {};
//指定多个时使用
@Target({FIELD,METHOD,PARAMETER,ANNOTATION_TYPE})
@Retention(RUNTIME)
@Documented
@interface list{
Forbidden[] value();
}
}
下面是验证类实现
package config;
import org.hibernate.validator.internal.engine.constraintvalidation.ConstraintValidatorContextImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.util.StringUtils;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.io.Serializable;
//定义验证器
public class ForbiddenValidator implements ConstraintValidator<Forbidden, String> {
private String[] fprdibben = {"admin"};
public void initilized(Forbidden constrastAnnotation){
//c初始化得到注解数据
}
@Override
public boolean isValid(String s, ConstraintValidatorContext context) {
if(StringUtils.isEmpty(context)){
return true;
}
for(String word:fprdibben){
if(s.contains(word)) return false;
}
return true;
}
}
下面是测试
package config;
import java.io.Serializable;
public class User implements Serializable {
@Forbidden
private String name;
public User(String name){
this.name = name;
}
}