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


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM