使用 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 版权协议,转载请附上原文出处链接和本声明。