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
。