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;
相关推荐
qfljg1 小时前
OpenRewrite 实战指南
java
Sylvia33.1 小时前
LOL实时数据接入深度解析:从WebSocket到完整数据模型
java·网络·python·websocket·网络协议
jyOverQ1 小时前
RabbitMQ 消息积压怎么办?Prefetch、消费者并发与扩容
分布式·后端·rabbitmq
2601_962071576 小时前
【Java报错已解决】org.springframework.beans.factory.BeanCreationException
java·开发语言
zww89491117 小时前
酒馆预约系统开发实战:从需求分析到上线全流程指南
java·eclipse
东风破_8 小时前
从跨域到 WebSocket:前端跨域方案、SSE 与双向实时通信详解
前端·后端
zww894911110 小时前
匿名树洞系统开发实战:从需求分析到部署指南
java·eclipse
行百里er10 小时前
Gateway 上别硬塞 MVC:DeferredImportSelector 看菜下锅
spring boot·后端·开源
名字还没想好☜10 小时前
Java 遍历时删元素抛 ConcurrentModificationException:fail-fast 原理与三种正确删法
后端
IT_陈寒11 小时前
React Hooks闭包陷阱差点让我加班到凌晨
前端·人工智能·后端