简单实现hibernate-validator拓展

本文介绍了如何利用hibernate-validator为业务场景定制注解@DateAfter及其对应的验证器DateAfterValidator,以确保日期参数大于指定的起始日期,如1970-01-01 08:30:00。通过创建注解、定义验证器并实现校验逻辑,可以轻松实现这一功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


概要

最近在使用hibernate-validator针对VO做一些简单校验. 其中有一个业务场景是需要校验日期参数必须大于某一天, 比如1970-01-01 08:30:00等.  


初步的方案是先创建一个注解类, 比如@DateAfter,  再指定@DateAfter的校验器DateAfterValidator,  再然后实现该校验器DateAfterValidator.


DateAfter.java

<pre name="code" class="java">package com.feisheng.annotation;
import static java.lang.annotation.ElementType.ANNOTATION_TYPE;import static java.lang.annotation.ElementType.CONSTRUCTOR;import static java.lang.annotation.ElementType.FIELD;import static java.lang.annotation.ElementType.METHOD;import static java.lang.annotation.ElementType.PARAMETER;import static java.lang.annotation.RetentionPolicy.RUNTIME;import java.lang.annotation.Documented;import java.lang.annotation.Retention;import java.lang.annotation.Target;import javax.validation.Constraint;import javax.validation.Payload;import com.vip.vpal.zc.admin.validator.DateAfterValidator;/** * The annotated element must be a date, and after the specified date. * Only accepts Date. * @author eric.mo */@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })@Retention(RUNTIME)@Documented@Constraint(validatedBy = { DateAfterValidator.class })public @interface DateAfter { String message() default "时间取值不正确"; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; long value() default 31536000000L; /** * Defines several {@link DateAfter} annotations on the same element. * * @see DateAfter */ @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER }) @Retention(RUNTIME) @Documented @interface List { DateAfter[] value(); }}




DateAfterValidator.java

package com.feisheng.validator;

import java.util.Date;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

import com.vip.vpal.zc.admin.annotation.DateAfter;

/**
 * The annotated element must be a date, and after the specified date.
 * Only accepts Date.
 * @author eric.mo
 */
public class DateAfterValidator implements ConstraintValidator<DateAfter, Date> {

    private Long setDateTime;

    @Override
    public void initialize(DateAfter constraintAnnotation) {
        setDateTime = constraintAnnotation.value();
    }

    @Override
    public boolean isValid(Date value, ConstraintValidatorContext context) {
        if (value == null) {
            return true;
        }

        return value.after(new Date(setDateTime));
    }

}



使用方式

    @DateAfter
    private Date sellStartTime; //直接添加注解
 

然后再使用hibernate-validator校验即可.



package com.vip.vpal.zc.admin.validator;import java.util.Date;import javax.validation.ConstraintValidator;import javax.validation.ConstraintValidatorContext;import com.vip.vpal.zc.admin.annotation.DateAfter;/** * The annotated element must be a date, and after the specified date. * Only accepts Date. * @author eric.mo */public class DateAfterValidator implements ConstraintValidator<DateAfter, Date> { private Long setDateTime; @Override public void initialize(DateAfter constraintAnnotation) { setDateTime = constraintAnnotation.value(); } @Override public boolean isValid(Date value, ConstraintValidatorContext context) { if (value == null) { return true; } return value.after(new Date(setDateTime)); }}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值