/**
* 枚举值限定校验
* 注意:枚举一定要包含 value 字段
*
*/
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER})
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = {EnumValueValidator.class})
public @interface EnumValue {
// 默认错误消息
String message() default "the integer is not one of the enum values";
// 约束注解在验证时所属的组别
Class<?>[] groups() default {};
// 约束注解的有效负载
Class<? extends Payload>[] payload() default {};
Class<? extends Enum> value();
// 同时指定多个时使用
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER})
@Documented
@Retention(RetentionPolicy.RUNTIME)
@interface List {
EnumValue[] value();
}
}
/**
* 与约束注解关联的校验器
*
* @author chensw
* @date 2022-12-06
*/
public class EnumValueValidator implements ConstraintValidator<EnumValue, Object> {
private Logger logger = LogManager.getLogger(getClass());
private Class<? extends Enum> enumClass;
private static final String METHOD_NAME = "getValue";
/**
* 这个方法做一些初始化校验
*
* @param constraintAnnotation
*/
public void initialize(EnumValue constraintAnnotation) {
enumClass = constraintAnnotation.value();
try {
// 先判断该enum是否实现了getValue方法
enumClass.getDeclaredMethod(METHOD_NAME);
} catch (NoSuchMethodException e) {
throw new IllegalArgumentException("the enum class has not getValue method", e);
}
}
/**
* 这个方法写具体的校验逻辑:校验数字是否属于指定枚举类型的范围
*
* @param value
* @param constraintValidatorContext
* @return
*/
public boolean isValid(Object value, ConstraintValidatorContext constraintValidatorContext) {
// 如果为空返回 true , 判空用 @NotNull 等专用注解
if (value == null) {
return true;
}
try {
Enum[] enumConstants = enumClass.getEnumConstants();
if (enumConstants == null) {
// 如果不是枚举类型,返回 enumConstants = null
return true;
}
for (Enum e : enumClass.getEnumConstants()) {
Method declaredMethod = e.getClass().getDeclaredMethod(METHOD_NAME);
Object obj = declaredMethod.invoke(e);
if (Objects.equals(obj, value)) {
return true;
}
}
} catch (Exception e) {
logger.error("校验枚举类型失败, value:{}", GsonUtil.toJson(value));
}
return false;
}
}
使用: