美文网首页
EnumUtils重构及自定义@EnumValue注解自动校验枚

EnumUtils重构及自定义@EnumValue注解自动校验枚

作者: Coder慌 | 来源:发表于2019-09-29 10:05 被阅读0次

    EnumUtils主要功能介绍

    该简单介绍可看笔者之前文章 java枚举工具类(减少每个枚举中重复的方法)
    但以上该方式存在一些问题,例如枚举值(value)可能为String也可能为Byte等等,不止只是Integer类型,而且有些枚举可能不需要枚举名称(name)属性,只需要个枚举值value属性即可,以上最简单的实现方式就不支持这些需求了,故通过拆分BaseEnum接口以及增加泛型来支持该要求。

    具体实现

    BaseEnum接口拆分为ValueEnum以及NameValueEnum接口

    ValueEnum接口定义
    /**
     * 最简单的枚举类,即只含value的枚举(实现此接口可使用{@link mayfly.core.util.EnumUtils}中的方法)
     * @author meilin.huang
     * @version 1.0
     * @date 2019-04-22 10:10
     */
    public interface ValueEnum<T> {
        /**
         * 获取枚举值
         * @return  枚举值
         */
        T getValue();
    }
    
    NameValueEnum接口定义
    /**
     * 带有枚举值以及枚举名称的枚举接口(可使用{@link mayfly.core.util.EnumUtils}中的方法)
     * @author meilin.huang
     * @version 1.0
     * @date 2019-03-22 11:04 AM
     */
    public interface NameValueEnum<T> extends ValueEnum<T> {
        /**
         * 获取枚举名称
         * @return 枚举名
         */
        String getName();
    }
    

    EnumUtils重构

    /**
     * 枚举常用工具类。<br/>
     * 使用该枚举工具类需要指定的枚举实现{@link ValueEnum} OR {@link NameValueEnum}接口
     * @author meilin.huang
     * @version 1.0
     * @date 2019-03-22 11:12 AM
     */
    public final class EnumUtils {
    
        /**
         * 判断枚举值是否存在于指定枚举数组中
         * @param enums  枚举数组
         * @param value  枚举值
         * @return
         */
        public static <T> boolean isExist(ValueEnum<T>[] enums, T value) {
            if (value == null) {
                return false;
            }
            for (ValueEnum<T> e : enums) {
                if (value.equals(e.getValue())) {
                    return true;
                }
            }
            return false;
        }
    
        /**
         * 根据枚举值获取其对应的名字
         * @param enums  枚举列表
         * @param value  枚举值
         * @return       枚举名称
         */
        public static <T> String getNameByValue(NameValueEnum<T>[] enums, T value) {
            if (value == null) {
                return "";
            }
            for (NameValueEnum e : enums) {
                if (value.equals(e.getValue())) {
                    return e.getName();
                }
            }
            return "";
        }
    
        /**
         * 根据枚举名称获取对应的枚举值
         * @param enums  枚举列表
         * @param name   枚举名
         * @return       枚举值
         */
        public static <T> T getValueByName(NameValueEnum<T>[] enums, String name) {
            if (StringUtils.isEmpty(name)) {
                return null;
            }
            for (NameValueEnum<T> e : enums) {
                if (name.equals(e.getName())) {
                    return e.getValue();
                }
            }
            return  null;
        }
    }
    

    自定义@EnumValue注解对入参进行自动校验

    通过hibernate validator自定义参数校验注解方式实现对入参为枚举类型的参数进行校验

    /**
     * 枚举值校验,即值只能是指定枚举类中的值
     * @author meilin.huang
     * @version 1.0
     * @date 2019-06-19 10:32 AM
     */
    @Target({ElementType.FIELD})
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Constraint(validatedBy = EnumValue.EnumValueValidator.class)
    public @interface EnumValue {
        /**
         * 错误提示
         */
        String message() default "枚举值错误";
    
        /**
         * 必须的属性
         * 用于分组校验
         */
        Class<?>[] groups() default {};
    
        Class<? extends Payload>[] payload() default {};
    
        /**
         * 枚举类(必须实现{@link EnumValue}接口的枚举)
         */
        Class<? extends Enum<? extends EnumValue>> enumClass();
    
    
    
        class ValueEnumValidator implements ConstraintValidator<EnumValue, Object> {
    
            private Class<? extends Enum<? extends EnumValue>> enumClass;
    
            @Override
            public void initialize(EnumValue enumValue) {
                this.enumClass = enumValue.enumClass();
            }
    
            @Override
            public boolean isValid(Object value, ConstraintValidatorContext context) {
                if (value == null) {
                    return true;
                }
                // 转换为ValueEnum接口
                Enum<? extends EnumValue>[] enums = enumClass.getEnumConstants();
                EnumValue[] enumValues = new EnumValue[enums.length];
                for (int i = 0; i < enums.length; i++) {
                    enumValues[i] = (EnumValue) enums[i];
                }
                return EnumUtils.isExist(enumValues, value)
            }
        }
    }
    
    使用:
      enum StringEnum implements ValueEnum<String> {
            S1("01"), S2("02");
    
            private String value;
            StringEnum(String value) {
                this.value = value;
            }
    
            @Override
            public String getValue() {
                return this.value;
            }
        }
    
        enum IntegerEnum implements ValueEnum<Integer> {
            I1(1), I2(2);
    
            private Integer value;
    
            IntegerEnum(Integer value) {
                this.value = value;
            }
    
    
            @Override
            public Integer getValue() {
                return this.value;
            }
        }
    
    
      public class User{
            @NotBlank
            private String username;
    
            @EnumValue(StringEnum.class)
            private String sEnum;
    
            @EnumValue(IntegerEnum.class)
            private Integer iEnum;
        } 
    

    相关文章

      网友评论

          本文标题:EnumUtils重构及自定义@EnumValue注解自动校验枚

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