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
。