SpringBoot枚举类型参数认证的实现代码
作者:代码君.
项目当中经常需要接口参数是否在一个可选的范围内,也就是验证类枚举参数的需求,所以本文我们将使用SpringBoot实现枚举类型参数认证,文中有详细的代码示例,需要的朋友可以参考下
背景
项目当中经常需要接口参数是否在一个可选的范围内,也就是验证类枚举参数的需求。
如果参数类型是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,接下来定义这个。
定义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;
到此这篇关于SpringBoot枚举类型参数认证的实现代码的文章就介绍到这了,更多相关SpringBoot枚举类型参数认证内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!