• springboot自定义通用枚举校验注解


    springboot自定义通用枚举校验注解

    1.新增枚举上层接口,所有需要进行枚举校验的接口必须实现此接口

    public interface IIterateEnum {
    
        /**
         * 获取枚举code值
         */
        int getCode();
    }
    
    

    2.枚举定义示例:

    @AllArgsConstructor
    public enum RebateFeeType implements IIterateEnum {
    
        /**
         * 固值
         */
        FIXED(1),
    
        /**
         * 百分比
         */
        PERCENT(2);
    
        private final int code;
    
        @Override
        public int getCode() {
            return this.code;
        }
    }
    
    

    3.自定义枚举注解和校验器

    
    /**
     * <p>
     * 枚举校验
     * </p>
     *
     * @author penggaofeng
     * @since 2022/3/8 9:41
     */
    @Documented
    @Constraint(
            validatedBy = {EnumValidator.EnumConstraintValidator.class}
    )
    @Target(value = {ElementType.FIELD})
    @Retention(RetentionPolicy.RUNTIME)
    public @interface EnumValidator {
        /**
         * 枚举
         *
         * @return
         */
        Class<? extends IIterateEnum> clazz();
    
        /**
         * 是否必须的(默认false)
         */
        boolean required() default false;
    
        /**
         * 错误信息
         *
         * @return
         */
        String message() default "枚举不存在";
    
        Class<?>[] groups() default {};
    
        Class<? extends Payload>[] payload() default {};
    
        class EnumConstraintValidator implements ConstraintValidator<EnumValidator, Object> {
            IIterateEnum[] enumConstants;
            boolean required;
    
            @SneakyThrows
            @Override
            public void initialize(EnumValidator constraintAnnotation) {
                enumConstants = constraintAnnotation.clazz().getEnumConstants();
                required = constraintAnnotation.required();
            }
    
            @Override
            public boolean isValid(Object o, ConstraintValidatorContext context) {
                if (Boolean.FALSE.equals(required) && Objects.isNull(o)) {
                    return Boolean.TRUE;
                }
                if (o instanceof Integer) {
                    for (IIterateEnum iIterateEnum : enumConstants) {
                        if (iIterateEnum.getCode() == (int)o) {
                            return true;
                        }
                    }
                }
                return false;
            }
        }
    }
    
    

    4.使用

    @Data
    public class PolicyFromVO {
        @ApiModelProperty(value = "单位返佣值类型,1:固值;2:百分比")
        @EnumValidator(message = "单位返佣(固值/百分比)类型错误", clazz = RebateFeeType.class)
        @JsonProperty("UnitRebateType")
        private Integer unitRebateType;
    }
    

    5.说明:自定义后的枚举校验注解和validation常用的@NotEmpty @NotNull等常用注解一般,我们可以通过 @EnumValidator来使用。通过message我们可以自定义校验失败后的错误信息,在这里我加入了一个required的参数,默认是false,通过required来控制枚举是否可以为空。clazz需要传入我们的枚举,在定义的注解中我么这样定义了Class<? extends IIterateEnum> clazz(),因此对传入的枚举做了限制,实现第一步所说的IIterateEnum是必不可缺的,此外要注意的是,枚举的code属性定义的是int

  • 相关阅读:
    Mac sublime text3 安装插件
    趣题记录
    Shadow DOM及自定义标签
    JavaScript 对象部署 Iterator 接口
    JavaScript实现循环链表
    使用JavaScript实现单向链表
    nodejs深入浅出读书笔记(三)
    nodejs深入浅出读书笔记(一)
    nodejs深入浅出读书笔记(二)
    为什么要了解Event loop?(二)
  • 原文地址:https://www.cnblogs.com/nowl/p/15990491.html
Copyright © 2020-2023  润新知