当前位置:网站首页>自己实现一个枚举validation校验器
自己实现一个枚举validation校验器
2022-08-04 10:18:00 【Mr1ght】
背景
平时我们在进行接口校验的时候,我们会使用@Validation相关注解来帮助我们简化代码。其常用的注解其实已经能满足很大一部分需求,但是在进行枚举字段的接口校验的时候没有相关字段,尤其在我们不是使用枚举的name()方法来传递的时候,枚举的校验就需要很多类似的大段的方法来进行校验。而validation本身是提供了扩展的方法的,因此在次基础上实现了一个对枚举进行校验的注解。
基础类
1.EnumValidation注解
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import javax.validation.Constraint;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import javax.validation.Payload;
import java.lang.annotation.*;
/** * 自定义枚举验证注解 */
@Documented
@Target({
ElementType.ANNOTATION_TYPE, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = {
EnumValidation.Validator.class})
public @interface EnumValidation {
/** * 错误提示信息 * * @return */
String message() default "Enumeration validation failed";
/** * 校验分组 * * @return */
Class<?>[] groups() default {
};
/** * 要检验参数所属的枚举数组 * * @return */
Class<? extends EnumType>[] enums();
/** * 要校验的参数是否可以为空 * * @return */
boolean canBeBlank() default true;
Class<? extends Payload>[] payload() default {
};
// 验证器内部类
@Slf4j
class Validator implements ConstraintValidator<EnumValidation, String> {
Class<? extends EnumType>[] enums;
boolean canBeBlank;
@Override
public void initialize(EnumValidation constraintAnnotation) {
this.enums = constraintAnnotation.enums();
this.canBeBlank = constraintAnnotation.canBeBlank();
}
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
//如果校验的字段为空,判断是否通过
if (StringUtils.isBlank(value) || enums.length < 1) {
return canBeBlank;
}
//校验枚举字段匹配
for (Class<? extends EnumType> clazz : enums) {
if (clazz.isEnum()) {
EnumType[] enumConstants = clazz.getEnumConstants();
for (EnumType enumType : enumConstants) {
if (value.equals(enumType.getValidKey())) {
return true;
}
}
}
}
return false;
}
}
}
2.EnumType 枚举公共父类
/** * 枚举继承公共类 */
public interface EnumType {
/** * 获取key * * @return 获取key */
String getValidKey();
}
使用方法
定义这两个类之后,我们只需要在我们定义的注解上继承EnumType
,然后实现其getValidKey
方法即可
如下:
/** * 是/否 枚举 */
public enum YesOrNoEnum implements EnumType {
NO(0, "否"),
YES(1, "是"),
;
YesOrNoEnum(int code, String desc) {
this.code = code;
this.desc = desc;
}
public int code;
public String desc;
@Override
public String getValidKey() {
return code + "";
}
}
然后在需要校验的字段上加上这个注解即可
import lombok.Data;
import org.hibernate.validator.constraints.Range;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
/** * 人类 * */
@Data
public class PersonDTO {
@NotBlank(message = "姓名不能为空")
@Size(max = 32, message = "姓名长度不能超过320")
private String name;
@NotNull(message = "年齡不能为空")
@Range(min = 0, max = 150, message = "年龄必须在0-150之间")
private Integer age;
@EnumValidation(enums = YesOrNoEnum.class, canBeBlank = false, message = "错误的会员标志")
private Integer memberFlag;
}
边栏推荐
猜你喜欢
随机推荐
双向带头循环链表实现
低代码是开发的未来吗?浅谈低代码开发平台的发展现状及未来趋势
高级转录组分析和R数据可视化火热报名中(2022.10)
再次搞定 Ali 云函数计算 FC
Jina 实例秀|七夕神器!比你更懂你女友的AI口红推荐
密码字典生成工具pydictor/john
关于ARM2440中断源个数的一点想法[通俗易懂]
ps抠图怎么抠出来,自学ps软件photoshop2022,ps怎么抠出想要的部分-笔记记录
IDEA 自动导入的配置(Auto import)
2022-08-03 第六小组 瞒春 学习笔记
HTB-Nibbles
各位大佬,请问mysql数据的cdc,能指定存量数据同步的zone为utc 吗
usb设备复合g_webcam摄像头码流传输功能以及g_serial串口功能
Qt:小的任务管理器(task)
超宽带UWB实时精准定位,短距离无缝交互应用,物联网厘米级精度方案
Camunda整体架构和相关概念
【c】操作符详解(二)
移动端 开源低代码工具 beeware 和 kivy
MySQL:完整性约束和 表的设计原则
JDBC知识点