SpringBoot实现枚举类型参数认证
2023-12-28 20:59:46
背景
项目当中经常需要接口参数是否在一个可选的范围内,也就是验证类枚举参数的需求。
如果参数类型是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;
文章来源:https://blog.csdn.net/qq_23365135/article/details/135276453
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!