SpringBoot实现枚举类型参数认证

背景

项目当中经常需要接口参数是否在一个可选的范围内,也就是验证类枚举参数的需求。

如果参数类型是String类型,那么可以使用@Pattern注解,就是用正则进行匹配,比如:

java 复制代码
@Pattern(regex = "^(male|female)$", message = "性别不合法")
private String gender;

但是如果参数类型不是String类型,就不能使用@Pattern了。SpringBoot的validation中并没有提供针对这种枚举值的校验注解。

接下来我们来自己实现一个。

定义枚举类

为了后续可以方便获取枚举值,我们的枚举类需要实现一个interface,就叫ValueEnum:

java 复制代码
public interface ValueEnum {
     Interger getValue();
}

定义枚举:

java 复制代码
@Getter
@RequiredArgsConstructor
public enum Gender implements ValueEnum {

    MALE(1, "男"),
    FEMALE(2, "女");
    private final Integer value;
    private final String name;
}

定义校验注解

java 复制代码
@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

java 复制代码
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;
    }
}

在代码中使用

java 复制代码
@EnumValue(enumClass = Gender.class)
private Integer gender;
相关推荐
涡能增压发动积6 小时前
同样的代码循环 10次正常 循环 100次就抛异常?自定义 Comparator 的 bug 让我丢尽颜面
后端
云烟成雨TD6 小时前
Spring AI Alibaba 1.x 系列【6】ReactAgent 同步执行 & 流式执行
java·人工智能·spring
Wenweno0o6 小时前
0基础Go语言Eino框架智能体实战-chatModel
开发语言·后端·golang
于慨6 小时前
Lambda 表达式、方法引用(Method Reference)语法
java·前端·servlet
swg3213216 小时前
Spring Boot 3.X Oauth2 认证服务与资源服务
java·spring boot·后端
tyung6 小时前
一个 main.go 搞定协作白板:你画一笔,全世界都看见
后端·go
gelald6 小时前
SpringBoot - 自动配置原理
java·spring boot·后端
@yanyu6666 小时前
07-引入element布局及spring boot完善后端
javascript·vue.js·spring boot
殷紫川6 小时前
深入理解 AQS:从架构到实现,解锁 Java 并发编程的核心密钥
java
一轮弯弯的明月6 小时前
贝尔数求集合划分方案总数
java·笔记·蓝桥杯·学习心得