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.自定义枚举注解和校验器


/**
 * 

* 枚举校验 *

* * @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 { 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

一不小心说了一堆废话,稍微看下代码都知道上面一段是多余的,稍微凑点字数,哈~