项目当中经常需要接口参数是否在一个可选的范围内,也就是验证类枚举参数的需求。
如果参数类型是String类型,那么可以使用@Pattern注解,就是用正则进行匹配,比如:
@Pattern(regex = "^(male|female)$", message = "性别不合法")
private String gender;
但是如果参数类型不是String类型,就不能使用@Pattern了。SpringBoot的validation中并没有提供针对这种枚举值的校验注解。
接下来我们来自己实现一个。
为了后续可以方便获取枚举值,我们的枚举类需要实现一个interface,就叫ValueEnum:
public interface ValueEnum {
Interger getValue();
}
定义枚举:
@Getter
@RequiredArgsConstructor
public enum Gender implements ValueEnum {
MALE(1, "男"),
FEMALE(2, "女");
private final Integer value;
private final String name;
}
@Target( FIELD )
@Retention(RUNTIME)
@Documented
@Constraint(validatedBy = EnumValueValidator.class)
public @interface EnumValue {
String message() default "参数值不合法";
Class<? extends ValueEnum> enumClass();
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
这里指定了校验器EnumValueValidator,接下来定义这个。
public class EnumValueValidator implements ConstraintValidator<EnumValue, Integer> {
private EnumValue enumValue;
@Override
public boolean isValid(Integer value, ConstraintValidatorContext context) {
Class<? extends ValueEnum> enumClass = enumValue.enumClass();
return Arrays.stream(enumClass.getEnumConstants()).anyMatch(i -> Objects.equals(i.getValue(), value));
}
@Override
public void initialize(EnumValue enumValue) {
this.enumValue = enumValue;
}
}
@EnumValue(enumClass = Gender.class)
private Integer gender;