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;
相关推荐
杨二K1 小时前
认识HertzBeat的第一天
java·hertzbeat
DevilSeagull1 小时前
JavaScript WebAPI 指南
java·开发语言·javascript·html·ecmascript·html5
期待のcode3 小时前
Spring框架1—Spring的IOC核心技术1
java·后端·spring·架构
鼠鼠我捏,要死了捏3 小时前
Spring Boot Actuator自定义指标与监控实践指南
spring boot·监控·actuator
葵野寺3 小时前
【RelayMQ】基于 Java 实现轻量级消息队列(七)
java·开发语言·网络·rabbitmq·java-rabbitmq
书院门前细致的苹果4 小时前
JVM 全面详解:深入理解 Java 的核心运行机制
java·jvm
上官浩仁4 小时前
springboot excel 表格入门与实战
java·spring boot·excel
Livingbody5 小时前
10分钟完成 ERNIE-4.5-21B-A3B-Thinking深度思考模型部署
后端
Hello.Reader5 小时前
从零到一上手 Protocol Buffers用 C# 打造可演进的通讯录
java·linux·c#
树码小子5 小时前
Java网络初识(4):网络数据通信的基本流程 -- 封装
java·网络