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