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

  • Post author:
  • Post category:其他




使用 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() 方法去获取值,然后对比



版权声明:本文为hxf009原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。