美文网首页
自定义注解枚举值校验

自定义注解枚举值校验

作者: 川流不息attitude | 来源:发表于2024-06-18 17:07 被阅读0次

    自定义注解枚举值校验

    1. 定义注解
    @Constraint(validatedBy = InEnumConstraintValidator.class)
    @Documented
    @Target(ElementType.FIELD)
    @Retention(RetentionPolicy.RUNTIME)
    public @interface InEnum {
    
        /**
         * 提示的message
         * @return message
         */
        String message() default "类型传入错误";
    
        /**
         * 用于校验的枚举
         */
        Class<? extends Enum<?>> enumClass();
    
        Class<?>[] groups() default { };
    
        Class<? extends Payload>[] payload() default { };
    }
    
    2 定义枚举接口
    public interface EnumListValidService<T> {
        /**
         * 枚举存在
         *
         * @param value
         * @return
         */
        boolean exist(T value);
    }
    
    3.定义实现
    public class InEnumConstraintValidator implements ConstraintValidator<InEnum, Object> {
    
        private Class<? extends Enum> enumClass;
    
        @Override
        public void initialize(InEnum constraintAnnotation) {
            enumClass = constraintAnnotation.enumClass();
        }
    
        @Override
        public boolean isValid(Object value, ConstraintValidatorContext constraintValidatorContext) {
            Enum[] enumConstants = enumClass.getEnumConstants();
            if (ArrayUtil.isEmpty(enumConstants)) {
                return true;
            }
            Enum enumConstant = enumConstants[0];
            boolean isImpl = enumConstant instanceof EnumListValidService;
            if(!isImpl){
                ServiceException.throwException(enumClass.getSimpleName()+"未实现接口EnumListValidService");
            }
            EnumListValidService enumListValidService = (EnumListValidService) enumConstant;
            return enumListValidService.exist(value);
        }
    }
    
    4. 使用
    @AllArgsConstructor
    @Getter
    public enum  SpecsActivityTypeEnum implements EnumListValidService<Integer> {
        FIRST_ORDER(1,"首单优惠"),
        LIMITED_TIME(2,"限时买一赠一"),
        PURCHASE_LIMIT(3,"限购");
    
        private Integer code;
    
        private String desc;
    
        @Override
        public boolean exist(Integer value) {
            Set<Integer> sets = Arrays.stream(SpecsActivityTypeEnum.values())
                    .map(SpecsActivityTypeEnum::getCode)
                    .collect(Collectors.toSet());
            return sets.contains(value);
        }
    }
    
     
    
    image.png

    相关文章

      网友评论

          本文标题:自定义注解枚举值校验

          本文链接:https://www.haomeiwen.com/subject/dwwfcjtx.html