spring 自定义校验注解解析

192 阅读1分钟

以时间校验为例

  • @interface关键字定义注解
  • 注解定义的方法有一些限制:方法不能有参数;返回值只能是基本类型、字符串、Class、枚举、注解、及以上类型的数组;可以包含默认值。
//描述注解可以文档化,是一个标记注解
@Documented 
//具体处理逻辑的实现类
@Constraint(
    validatedBy = {TimeGroupValidConstraint.class}
)
/**
*描述注解的使用目标,取值有:
*ElementType.PACKAGE 注解作用于包
*ElementType.TYPE 注解作用于类型(类,接口,注解,枚举)
*ElementType.ANNOTATION_TYPE 注解作用于注解
*ElementType.CONSTRUCTOR 注解作用于构造方法
*ElementType.METHOD 注解作用于方法
*ElementType.PARAMETER 注解作用于方法参数
*ElementType.FIELD 注解作用于属性
*ElementType.LOCAL_VARIABLE 注解作用于局部变量
*默认可以作用于以上任何目标。
*/
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER})
/**
*描述注解的生命周期,取值有:
*RetentionPolicy.SOURCE 源码中保留,编译期可以处理
*RetentionPolicy.CLASS Class文件中保留,Class加载时可以处理
*RetentionPolicy.RUNTIME 运行时保留,运行中可以处理
*默认RetentionPolicy.CLASS 值
*/
@Retention(RetentionPolicy.RUNTIME)
/**
*是否允许子类继承该注解。即@TimeGroupValid如果修饰了类A,
*那么类A的子类类B也会默认被@TimeGroupValid 修饰。
*/
@Inherited
public @interface TimeGroupValid {
    String message() default "TimeGroup was not a compliance value";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};
}
public class TimeGroupValidConstraint implements ConstraintValidator<TimeGroupValid, String> {
    public TimeGroupValidConstraint() {
    }
    //调用方法之前先初始化
 @Override
    public void initialize(TimeGroupValid constraintAnnotation) {
    }
    //校验的具体逻辑
 @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        if (StringUtils.isEmpty(value)) {
            return false;
        } else {
            TimeGroupEnum[] timeGroupEnums = (TimeGroupEnum[])TimeGroupEnum.class.getEnumConstants();
            TimeGroupEnum[] var4 = timeGroupEnums;
            int var5 = timeGroupEnums.length;
            for(int var6 = 0; var6 < var5; ++var6) {
                TimeGroupEnum timeGroupEnum = var4[var6];
                if (StringUtils.equals(value, timeGroupEnum.getInterval())) {
                    return true;
                }
            }
            return false;
        }
    }
}