SpringBoot--时间校验

在日常开发中常常会出现接口参数中有开始时间和结束时间两个属性,需要校验两个时间的大小关系,但JSR-303并未给出这样的注解,但是给出了ConstraintValidator这个接口,提供用户的自定义校验。下面开始开始时间和结束时间校验的注解。
1 时间校验注解
这个注解只能应用于类上,通过startTime和endTime方法指定被注解的类的开始时间和结束时间的属性名。

@Target({ElementType.TYPE})
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = {TimeValidate.class})
public @interface TimeValidate {
    String message() default "开始时间不能大于结束时间";

    String startTime() default "startTime";
    String endTime() default "endTime";
    boolean required() default true;

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

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

2 时间校验的实现类TimeValidate

@Slf4j
public class TimeLimitValidate implements ConstraintValidator<TimeLimit, Object> {

    private TimeLimit timeLimit;

    @Override
    public void initialize(TimeLimit constraintAnnotation) {
        this.timeLimit = constraintAnnotation;
    }

    @Override
    public boolean isValid(Object object, ConstraintValidatorContext constraintValidatorContext) {
        Object startTime = getObjectPropertyValue(object, timeLimit.startTime());
        Object endTime = getObjectPropertyValue(object, timeLimit.endTime());
        if(null == startTime || null == endTime || !startTime.getClass().equals(endTime.getClass())) {
            return true;
        }
        if(startTime instanceof Long && (Long)startTime > (Long) endTime) {
            return false;
        }
        if(startTime instanceof Date && ((Date) startTime).getTime() > ((Date)endTime).getTime()) {
            return false;
        }    
        return true;
    }

    /**
     * 从Object中获取指定的属性的值
     * @param object
     * @param paramName
     * @return
     * @throws NoSuchFieldException
     * @throws IllegalAccessException
     */
    private Object getObjectPropertyValue (Object object, String paramName) {
        Field field = null;
        try {
            field = object.getClass().getDeclaredField(paramName);
            field.setAccessible(true);
            return field.get(object);
        } catch (Exception e) {
           log.info("===异常信息 e = ", e);
        }
        return null;
    }
}

通过反射获取类中指定的属性值,在Spring中提供了BeanWrapper接口,可以获取到Object的指定属性的值。这里可以进一步优化。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值