一、定义校验注解
import javax.validation.Constraint; import javax.validation.Payload; import java.lang.annotation.Documented; import java.lang.annotation.Repeatable; import java.lang.annotation.Retention; import java.lang.annotation.Target; import static java.lang.annotation.ElementType.*; import static java.lang.annotation.RetentionPolicy.RUNTIME; /** * 自定义枚举类校验注解 * * @ClassName EnumValidate.java * @Description Controller入参对象中属性枚举项校验 */ @Documented @Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE}) @Retention(RUNTIME) @Repeatable(EnumValidation.List.class) @Constraint(validatedBy = {EnumValidator.class}) public @interface EnumValidation { String message() default "{*.validation.constraint.Enum.message}"; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; /** * 枚举类类型 * * @return Class */ Class<?> clazz(); /** * 方法名称,用于验证枚举的值 * * @return 方法名称 */ String method() default "getCode"; /** * 同一元素上可以定义多个注解 {@link EnumValidation} * * @see EnumValidation */ @Documented @Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE}) @Retention(RUNTIME) @interface List { EnumValidation[] value(); } }
二、定义校验规则
import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext; import java.lang.reflect.Method; /** * 自定义枚举类校验器 * * @ClassName EnumValidator.java * @Description Controller入参对象中属性枚举项校验 */ public class EnumValidator implements ConstraintValidator<EnumValidation, Object> { private EnumValidation annotation; /** * 初始化校验器 * <p> * 保证在使用此实例进行任何验证之前调用此方法。 * <p> * 默认无操作 * * @param constraintAnnotation 注解实例 */ @Override public void initialize(EnumValidation constraintAnnotation) { this.annotation = constraintAnnotation; } /** * 实现验证逻辑 * {@code value} 不可更改 * 该方法可以并发访问,必须通过实现来保证线程安全。 * * @param value 验证对象 * @param context context in which the constraint is evaluated * @return 验证成功返回true, 不成功返回false */ @Override public boolean isValid(Object value, ConstraintValidatorContext context) { if (value == null) { return false; } Object[] objects = annotation.clazz().getEnumConstants(); try { Method method = annotation.clazz().getMethod(annotation.method()); for (Object o : objects) { if (value.equals(method.invoke(o))) { return true; } } } catch (Exception e) { throw new RuntimeException(e); } return false; } }
三、使用样例
@EnumValidation(clazz = xxxxEnum.class, message = "加入类型不正确!")