当前位置: 首页 > news >正文

使用validator实现枚举类型校验

使用validator实现枚举类型校验

前言: 在前端调用后端接口传递参数的过程中,我们往往需要对前端传递过来的参数进行校验,比如说我们此时需要对用户的状态进行更新,而用户的状态只有正常和已删除,并且是在代码中通过枚举已经定义好的了。此时我们在校验前端传递过来的状态字段的时候,就可以使用validator对状态字段进行校验

1. 解决思路

我们有两种方式可以实现:

  1. 使用validator的@Pattern 注解,此时我们需要将userStatus的类型改为String类型
    @Pattern(regexp = “^[1-2]$”, message = “Status must be 1 or 2”)
  2. 使用自定义枚举校验器

下面我们来重点讲解一下如何基于自定义枚举校验器来实现对枚举类型字段的校验

2. 实现方式

2.1 创建自定义枚举

@Documented
@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE})
@Retention(RUNTIME)
@Repeatable(EnumValidation.List.class) // 允许在同一元素上多次使用该注解
@Constraint(validatedBy = {EnumValidator.class})
public @interface EnumValidation {String message() default "{*.validation.constraint.Enum.message}";Class<?>[] groups() default {};Class<? extends Payload>[] payload() default {};Class<?> clazz();String method() default "ordinal";@Documented@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE})@Retention(RUNTIME)@interface List {EnumValidation[] value();}
}

2.2 创建自定义枚举校验器

/*** @desc: 枚举验证器* @author: shy* @date: 2023/11/13 16:43*/
public class EnumValidator implements ConstraintValidator<EnumValidation, Object> {private EnumValidation annotation;@Overridepublic void initialize(EnumValidation constraintAnnotation) {this.annotation = constraintAnnotation;}@Overridepublic boolean isValid(Object value, ConstraintValidatorContext context) {if (value == null) {return false;}Object[] objects = annotation.clazz().getEnumConstants();try {Method method = annotation.clazz().getMethod(annotation.method());for (Object o : objects) {if (value.equals(method.invoke(o))) {return true;}}} catch (Exception e) {throw new RuntimeException(e);}return false;}
}

2.3 用户状态枚举

属性的get方法必须要实现,此处直接使用Lombok

/*** @desc: 用户状态枚举* @author: shy* @date: 2022/2/4 0:36*/
@Getter
public enum UserStatusEnum {正常(1),已删除(2);final int value;UserStatusEnum(int value) {this.value = value;}
}

2.4 枚举添加

此时我们就可以直接在相应的字段上加上自定义好的注解

@Data
@FieldDefaults(level = AccessLevel.PRIVATE)
@ApiModel(description = "用户更新参数")
public class UserUpdateParam implements Serializable {private static final long serialVersionUID = -484458568568755349L;@ApiModelProperty(value = "用户id", name = "userId", required = true)@NotNull(message = "用户id不能为空")Integer userId;@ApiModelProperty(value = "用户状态", name = "userStatus", required = true)@EnumValidation(clazz = UserStatusEnum.class, method = "getValue", message = "用户状态不合法")Integer userStatus;
}

3. 测试

此时我们调用更新接口进行,就可以看到如下结果:
在这里插入图片描述
至此,大功告成!

4. 总结

一开始的时候是想通过@Max和@Min的方式去实现,但是觉着那样的方式不够优雅,而且用户如果新增了别的状态,涉及到状态校验的地方都需要改动,涉及范围比较广,所以想到了这样的方式。

欢迎大家借鉴参考~

相关文章:

  • MacOS Ventura 13 优化配置(ARM架构新手向导)
  • VSCode 好用的插件分享
  • 【多线程 - 04、Join 方法与 wait 方法】
  • postman调用接口报{“detail“:“Method \“DELETE\“ not allowed.“}错误, 解决记录
  • Spark3.0中的AOE、DPP和Hint增强
  • C++知识点梳理:移动语意、右值
  • js实现对象数组去重
  • kali命令行下python多版本切换
  • 2023年数维杯国际大学生数学建模挑战赛
  • js设置图片放大缩小拖动
  • [工业自动化-19]:西门子S7-15xxx编程 - 软件编程 - PLC程序块、组织块OB与PLC多线程原理、OB、FC、FB、DB
  • STM32与RTOS的整合:实时操作系统在嵌入式开发中的应用
  • 自定义Graph Component:1.2-其它Tokenizer具体实现
  • 卫星通信和800MHz双管齐下,中国电信对中国移动发起新挑战
  • 55基于matlab的1.高斯噪声2.瑞利噪声3.伽马噪声4.均匀分布噪声5.脉冲(椒盐)噪声
  • 分享的文章《人生如棋》
  • Angular Elements 及其运作原理
  • Angular2开发踩坑系列-生产环境编译
  • Javascript编码规范
  • Java深入 - 深入理解Java集合
  • LeetCode算法系列_0891_子序列宽度之和
  • Netty+SpringBoot+FastDFS+Html5实现聊天App(六)
  • python 装饰器(一)
  • vue-cli3搭建项目
  • 阿里云容器服务区块链解决方案全新升级 支持Hyperledger Fabric v1.1
  • 第13期 DApp 榜单 :来,吃我这波安利
  • 利用DataURL技术在网页上显示图片
  • 那些年我们用过的显示性能指标
  • 我的zsh配置, 2019最新方案
  • 学习ES6 变量的解构赋值
  • 用jQuery怎么做到前后端分离
  • 专访Pony.ai 楼天城:自动驾驶已经走过了“从0到1”,“规模”是行业的分水岭| 自动驾驶这十年 ...
  • ​ArcGIS Pro 如何批量删除字段
  • ​Spring Boot 分片上传文件
  • ​软考-高级-系统架构设计师教程(清华第2版)【第1章-绪论-思维导图】​
  • # Swust 12th acm 邀请赛# [ A ] A+B problem [题解]
  • #大学#套接字
  • #设计模式#4.6 Flyweight(享元) 对象结构型模式
  • #中的引用型是什么意识_Java中四种引用有什么区别以及应用场景
  • (06)Hive——正则表达式
  • (2)(2.4) TerraRanger Tower/Tower EVO(360度)
  • (32位汇编 五)mov/add/sub/and/or/xor/not
  • (Redis使用系列) Springboot 实现Redis消息的订阅与分布 四
  • (二)斐波那契Fabonacci函数
  • (附源码)spring boot建达集团公司平台 毕业设计 141538
  • (附源码)ssm经济信息门户网站 毕业设计 141634
  • (原創) 如何優化ThinkPad X61開機速度? (NB) (ThinkPad) (X61) (OS) (Windows)
  • (转)淘淘商城系列——使用Spring来管理Redis单机版和集群版
  • *2 echo、printf、mkdir命令的应用
  • ../depcomp: line 571: exec: g++: not found
  • .net CHARTING图表控件下载地址
  • @ResponseBody
  • [Android Pro] listView和GridView的item设置的高度和宽度不起作用
  • [BPU部署教程] 教你搞定YOLOV5部署 (版本: 6.2)
  • [BZOJ3223]文艺平衡树