SpringBoot枚举类型参数认证的实现代码
背景
项目当中经常需要接口参数是否在一个可选的范围内,也就是验证类枚举参数的需求。
如果参数类型是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;
到此这篇关于SpringBoot枚举类型参数认证的实现代码的文章就介绍到这了,更多相关SpringBoot枚举类型参数认证内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
Quartz定时任务管理方式(动态添加、停止、恢复、删除定时任务)
这篇文章主要介绍了Quartz定时任务管理方式(动态添加、停止、恢复、删除定时任务),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教2023-12-12使用Spring的ApplicationEvent实现本地事件驱动的实现方法
本文介绍了如何使用Spring的ApplicationEvent实现本地事件驱动,通过自定义事件和监听器,实现模块之间的松耦合,提升代码的可维护性和扩展性。同时还介绍了异步事件和事件传递的相关知识2023-04-04
最新评论