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;
相关推荐
_Evan_Yao6 小时前
Redis 缓存穿透、击穿、雪崩,一次讲清!
java·spring·mybatis
梓豪csd7 小时前
消息订阅中心:谁该收到哪条通知
java·开发语言·人工智能·低代码·自动化·1024程序员节
秋饼7 小时前
Spring AI 2.1 Message Parts 深度实战:推理签名回放与跨轮记忆持久化的源码级落地
java·ai·技术分享·后端开发
王中阳Go7 小时前
两个入口答案不一致先别调模型:6 行入口口径对账表(附脚本)
人工智能·后端·python·大语言模型·1024程序员节
thefool1122668 小时前
TCP 1
java·1024程序员节
码事漫谈8 小时前
消除AI幻觉,普通人能做的五件事
后端
paopaokaka_luck9 小时前
宠物门店经营管理系统(销售与库存联动、进货自动记账、 退换与退款关联、员工个人业绩、ECharts 经营分析、滞销识别与客户分层、宠物档案年龄计算)
前端·javascript·spring boot·mysql·echarts·mybatis·1024程序员节
金銀銅鐵10 小时前
[Java] 用 GUI 展示 EnumSet 增减元素时的内部变化(下)
java·后端·ai编程
AI人工智能+电脑小能手10 小时前
一次请求打几个下游,这个Java并行任务工具类6个方法按序聚合
java·线程池·并发编程·1024程序员节·批量处理·并行任务
Mk5987812 小时前
给 Agent 装上对话框 —— AgentScope-Java 接入 Spring Boot 与 SSE 流式实战
后端