自定义注解校验时间

自定义注解的几个要素是:

(1)@Retention:注解的保留策略,

@Retention(RetentionPolicy.SOURCE)  // 注解仅存在于源码中,在class字节码文件中不包含
@Retention(RetentionPolicy.CLASS)   // 默认的保留策略,注解会在class字节码中存在,但运行时无法获得
@Retention(RetentionPolicy.RUNTIME) // 注解会在class字节码中存在,在运行时可以通过反射获取到

(2)@Target:注解的作用目标,是作用在接口、类、方法还是注解等地方 

@Target(ElementType.TYPE)            // 接口,类,枚举,注解
@Target(ElementType.FIELD)           // 字段、枚举的常量
@Target(ElementType.METHOD)          // 方法
@Target(ElementType.PARAMETER)       // 方法参数
@Target(ElementType.CONSTRUCTOR)     // 构造方法
@Target(ElementType.LOCAL_VARIABLE)  // 局部变量
@Target(ElementType.ANNOTATION_TYPE) // 注解
@Target(ElementType.PACKAGE)         // 包

(3)@Document:注解包含在javadoc中

(4)@Inherited:注解可以被继承

(5)注解解析器:解析自定义注解

实践一下,实现对Date的校验。

第一步:注解的定义:

@Documented
// 指定该注解可以使用的地方
@Target(value = {ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
// 指定实际进行校验的校验器,该校验器是自己写的且必须实现ConstraintValidator接口
@Constraint(validatedBy = MyDateAnnValidator.class)
public @interface MyDateValid {

    /**
     * 时间不早于
     * @return
     */
    String minDate() default "";

    /**
     * 时间不晚于
     * @return
     */
    String maxDate() default "";

    /**
     * 时间格式定义
     * @return
     */
    String pattern() default "yyyy-MM-dd";

    /**
     * 没加default给定默认值,使用注解的时候该属性必须赋值,否则报错
     * @return
     */
    String message();

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

    Class<? extends Payload>[] payload() default {};
}

第二步:实现:

public class MyDateAnnValidator implements ConstraintValidator<MyDateValid, Date> {

    private MyDateValid myDateValid;
    /**
     * Initializes the validator in preparation for
     * {@link #isValid(Object, ConstraintValidatorContext)} calls.
     * The constraint annotation for a given constraint declaration
     * is passed.
     * <p/>
     * This method is guaranteed to be called before any use of this instance for
     * validation.
     *
     * @param constraintAnnotation annotation instance for a given constraint declaration
     */
    @Override
    public void initialize(MyDateValid constraintAnnotation) {
        this.myDateValid = constraintAnnotation;
    }

    /**
     * Implements the validation logic.
     * The state of {@code value} must not be altered.
     * <p/>
     * This method can be accessed concurrently, thread-safety must be ensured
     * by the implementation.
     *
     * @param value   object to validate
     * @param context context in which the constraint is evaluated
     * @return {@code false} if {@code value} does not pass the constraint
     */
    @Override
    public boolean isValid(Date value, ConstraintValidatorContext context) {
        String pattern = myDateValid.pattern();
        SimpleDateFormat df = new SimpleDateFormat(pattern);
        String myMinDate = myDateValid.minDate();
        String myMaxDate = myDateValid.maxDate();
        // 为空可以放过
        if (value == null){
            return true;
        }
        try {
            Date maxDate = null;
            Date minDate = null;
            if ("".equals(myMinDate)){
                // 未设置最小时间
                maxDate = df.parse(myDateValid.maxDate());
                // compareTo方法, 1:后者大于前者;-1:后者小于前者;0:两个相同
                return value.compareTo(maxDate) != 1;
            } else if ("".equals(myMaxDate)){
                // 未设置最大时间
                minDate = df.parse(myDateValid.minDate());
                return value.compareTo(minDate) >= 0;
            } else {
                // 设置了最大时间和最小时间
                maxDate = df.parse(myDateValid.maxDate());
                minDate = df.parse(myDateValid.minDate());
                return value.compareTo(maxDate) != 1 && value.compareTo(minDate) >= 0;
            }
        } catch (ParseException e) {
            e.printStackTrace();
        }

        return false;
    }
}

用法:

    @MyDateValid(maxDate = "2099-01-01",message = "有效期限不能超过2099-01-01")
    private Date driverLicenseDate;
    
    @MyDateValid(minDate = "2019-01-01",message = "有效期限不能早于2019-01-01")
    private Date driverLicenseDate;

    @MyDateValid(minDate = "2019-01-01",maxDate = "2099-01-01",message = "有效期限不能早于2019-01-01,不能超过2099-01-01")
    private Date driverLicenseDate;

备注:如果想要改造一下message,也是可以的,注解中message设个default,然后在实现中你自己去自定义msg,用到的方法:

ctx.disableDefaultConstraintViolation();
ctx.buildConstraintViolationWithTemplate(msg).addConstraintViolation();

参考博客:SpringMVC自定义注解进行日期校验_一个有梦想的年轻人-CSDN博客

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值