spring boot使用 ConstraintValidator 实现接口枚举校验

4 篇文章 0 订阅
1 篇文章 0 订阅

使用 ConstraintValidator 实现接口枚举校验

自定义一个注解类

@Target({ElementType.FIELD, ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = {EnumValidator.class})
@Documented
public @interface EnumValid {

    String message() default "";

    // 作用参考@Validated和@Valid的区别
    Class<?>[] groups() default {};

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

    /**
     * 目标枚举类
     */
    Class<?> target() default Class.class;

    /**
     * 不能为空
     */
    boolean ignoreEmpty() default true;
}

实现方法

@Slf4j
public class EnumValidator implements ConstraintValidator<EnumValid, Object> {
    private final static String METHOD_NAME = "getValue";
    private EnumValid annotation;

    @Override
    public void initialize(EnumValid constraintAnnotation) {
        annotation = constraintAnnotation;
    }

    @Override
    public boolean isValid(Object value, ConstraintValidatorContext constraintValidatorContext) {
        Class<?> cls = annotation.target();
        boolean ignoreEmpty = annotation.ignoreEmpty();
        // target为枚举,并且value有值,或者不忽视空值,才进行校验
        if (cls.isEnum() && !ignoreEmpty) {
            return true;
        }
        boolean isCheck = cls.isEnum() && null != value;
        if (!isCheck) {
            return false;
        }
        boolean result = false;
        //获取枚举
        Object[] objects = cls.getEnumConstants();
        try {
            //获取方法
            Method method = cls.getMethod(METHOD_NAME);
            //循环枚举
            for (Object obj : objects) {
                //执行方法
                Object code = method.invoke(obj);
                //对比值
                if (Objects.deepEquals(value, code)) {
                    result = true;
                    break;
                }
            }
        } catch (Exception e) {
            log.error("EnumValidator call isValid() method exception", e);
        }
        return result;
    }
}

使用注解

  @EnumValid(message = "状态不对", target = StatusEnum.class, ignoreEmpty = false)
    private Integer status;
注意实项
1.枚举需要有 value属性,因为验证是通过反射获取getValue() 方法去获取值,然后对比
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值