自定义校验注解:枚举、列举模式

news2024/11/16 1:22:18

1、想使用枚举作为参数校验对象,减少手工代码量。
2、有些参数是固定的,列举校验,减少…

一、枚举模式

1、一般枚举

注释

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.PARAMETER})
@Constraint(validatedBy = EnumValidator.class)
public @interface EnumValid {

    Class<?> value() ;

    String message() default "入参值不在正确枚举中";

    /**
     * 默认反射调用的方法
     * @return 返回方法参数
     */
    String method() default "getName";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};

}

校验器

@Slf4j
public class EnumValidator implements ConstraintValidator<EnumValid, String> {

    /**
     * 枚举代码
     */
    private final Set<String> codeList = new HashSet<>();

    @Override
    public void initialize(EnumValid enumValid) {
        Class<?> clazz = enumValid.value();
        Object[] objects = clazz.getEnumConstants();
        try {
            // 反射获取对应方法
            Method method = clazz.getMethod(enumValid.method());
            Object value;
            for (Object obj : objects) {
                // 调用 获取校验值
                value = method.invoke(obj);
                codeList.add((String) value);
            }
        } catch (Exception e) {
            log.error("处理枚举校验异常: ", e);
        }
    }

    @Override
    public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext) {
        return null == value || codeList.contains(value);
    }

}

默认使用
在这里插入图片描述
非默认使用

使用getAlg作为参数初始化获取函数

在这里插入图片描述
枚举对象示例:
在这里插入图片描述

二、列举模式

1、字符列举

注释

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.PARAMETER})
@Constraint(validatedBy = StrValidator.class)
public @interface StrValid {

    String[] value() default {};

    String message() default "str val is not found";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};
}

校验器

public class StrValidator implements ConstraintValidator<StrValid, String> {
    private Set<String> limitValues;

    @Override
    public void initialize(StrValid flagValidator) {
        limitValues = Arrays.stream(flagValidator.value()).collect(Collectors.toSet());
    }

    @Override
    public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext) {
        if (StringUtils.isBlank(value)) {
            //当状态为空时使用默认值
            return true;
        }
        return limitValues.contains(value);
    }
}

用法
在这里插入图片描述

2、整型列举

注释

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.PARAMETER})
@Constraint(validatedBy = IntValidator.class)
public @interface IntValid {

    int [] value();

    String message() default "int val error";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};
}

校验器

@Slf4j
public class IntValidator implements ConstraintValidator<IntValid, Integer> {

    /**
     * 限制内容
     */
    private int[] limitValues;

    @Override
    public void initialize(IntValid flagValidator) {
        limitValues = flagValidator.value();
    }

    @Override
    public boolean isValid(Integer value, ConstraintValidatorContext constraintValidatorContext) {
        if (null == value) {
            //当状态为空时使用默认值
            return true;
        }
        for (int limitValue : limitValues) {
            if (limitValue == value) {
                return true;
            }
        }
        return false;
    }

}

用法
在这里插入图片描述

最后:
以上校验器不校验空值,不为空需要添加@NotNull注释

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1510548.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

内网渗透-跨域环境渗透-1

目录 smbclient工具 mimikatz工具 Kerbers协议 NTLM认证 hash传递攻击&#xff08;PTH攻击&#xff09; 黄金票据攻击 白银票据 MS14-068 smbclient工具 在linux里面连接远程windows共享目录&#xff0c;可以使用这个工具 ​ 第一种连接方式&#xff1a;smbclient -L 目…

蝙蝠避障:我生活中的一道光

盲人的世界&#xff0c;是无尽的黑暗。看不见光&#xff0c;看不见色彩&#xff0c;甚至看不见自己的手。但在这个黑暗的世界里&#xff0c;我找到了一个光明的出口&#xff1a;一款可以障碍物实时检测的名为蝙蝠避障的盲人软件。 这款软件就像是我的一双眼睛。它通过先进的激光…

基于SpringBoot+MYSQL的大学生入学审核系统

目录 1、 前言介绍 2、主要技术 3、系统概要设计 3.1、概述 3.2、系统结构 3.3、数据库设计 3.3.1、数据库实体 3.3.2、数据库设计表 4、运行截图(部分) 4.1、学生信息管理 4.2、学生信息查询 4.3、学生信息修改 4.4、办理学生入学 4.5、学生学籍管理 4.6、入学办…

数据集生成 YOLOV5 可训练的数据目录、并且可视化

1、前言 YOLOV5 训练数据的目录结构如下&#xff1a; 如果有测试集的话&#xff0c;也按照下面目录摆放即可 注意&#xff1a;这里的图片和标签文件名要严格对应&#xff01;&#xff01;后缀除外 关于YOLOv5介绍或者yolo格式的介绍参考之前专栏&#xff0c; 2、划分数据生成…

指针篇章-(4)+qsort函数的模拟

学习目录 ———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————…

第二十一天-NumPy

目录 什么是NumPy NumPy使用 1.数组的创建 2.类型转换 3.赠删改查 4.数组运算 5.矩阵运算 什么是NumPy 1.NumPy操作的是多维数组&#xff0c;什么是纬度&#xff1f; NumPy使用 1. 安装 pip install numpy import numpy as np 2.官网&#xff1a; 中文官网&#xff1a…

Vue3案例——通过指令实现下拉菜单效果

2.6 Vue3案例——通过指令实现下拉菜单效果 使用v-for指令可以对数组、对象进行循环&#xff0c;来获取其中的每一个值。 1. v-for指令遍历数组 使用v-for指令时&#xff0c;必须使用特定语法alias in expression&#xff0c;其中items是源数据数组&#xff0c;而item则是被…

java集合题库详解

1. Arraylist与LinkedList区别 可以从它们的底层数据结构、效率、开销进行阐述哈 ArrayList是数组的数据结构&#xff0c;LinkedList是链表的数据结构。 随机访问的时候&#xff0c;ArrayList的效率比较高&#xff0c;因为LinkedList要移动指针&#xff0c;而ArrayList是基于索…

宏工科技数智方案现先进陶瓷展,VR体验数字工厂引关注

3月6-8日&#xff0c;第十六届中国国际粉末冶金、硬质合金与先进陶瓷展览会在上海举行。本届展会&#xff0c;宏工科技股份有限公司携VR体验数字工厂和正负压气力输送系统惊艳亮相&#xff0c;“现实虚拟”的呈现方式收获众多行业客户及专业观众高度关注。 展会汇聚了来自粉末冶…

第十三届蓝桥杯嵌入式省赛程序设计详细题解

第十三届蓝桥杯嵌入式省赛题目相对于第十二届较为简单&#xff0c;没有那么多串口的数据处理以及判断&#xff01; 第十三届省赛主要是制作一个可由串口设置密码的密码锁。本实验中&#xff0c;我们将用到LED模块、按键模块、串口模块、定时器的PWM模块以及官方会提供源码的LC…

[Linux_IMX6ULL应用开发]-hello程序的交叉编译

目录 【开发板、虚拟机和PC的三者联通】 使用串口连接到开发板 连接Ubuntu虚拟机 互ping测试 【交叉编译hello.c文件】 Ubuntu编译无法在板子运行问题 使用交叉编译链编译hello.c 【开发板、虚拟机和PC的三者联通】 在这里我们使用IMX6ULL-PRO开发板进行学习&#xff0c;…

python+requests接口自动化框架的实现

为什么要做接口自动化框架 1、业务与配置的分离 2、数据与程序的分离&#xff1b;数据的变更不影响程序 3、有日志功能&#xff0c;实现无人值守 4、自动发送测试报告 5、不懂编程的测试人员也可以进行测试 正常接口测试的流程是什么&#xff1f; 确定接口测试使用的工具…

内部应用解耦神器-Spring事件

大家好&#xff0c;我是程序员牛牛&#xff0c;《AI超级个体: ChatGPT与AIGC实战指南》的参与人&#xff0c;10年Java编程程序员。 1. 概述 在做业务开发过程中&#xff0c;有些复杂点的逻辑&#xff0c;可能代码逻辑会很冗长&#xff0c;举一个很简单的例子&#xff0c;如&am…

windows解决nodejs版本冲突:安装版本管理器nvm,可根据不同项目一键切换适配版本

windows解决nodejs版本冲突&#xff1a;安装版本管理器nvm&#xff0c;可根据不同项目一键切换适配版本 参考来源&#xff1a;在本机 Windows 上设置 NodeJS | Microsoft Learn 建议安装版本管理器 nvm-windows&#xff0c;再用它来安装 Node.js 和 npm&#xff0c;这样可以根据…

C++学习笔记:红黑树

红黑树 什么是红黑树红黑树的规则红黑树节点的定义红黑树的插入空树插入非空插入条件判断新插入的节点 cur 不为 root 且 parent->_col 为红就需要调整父节点为左 grandf->left parent当uncle节点为红色时,只需要进行颜色调整,即可当uncle为空 或 者存在但是为黑parent …

Midjourney能让角色保持一致了

Midjourney发布新功能&#xff0c;网友直呼“不可思议”&#xff01; 现在你可以让生成的图像几乎保持角色一致&#xff0c;belike&#xff1a; 所有超级英雄长一个模样盯着你。 甚至动漫风、写实风等跨风格生成也同样适用&#xff1a; 保持同一风格&#xff0c;感jio配上文字…

【FPGA】DDR3学习笔记(一)丨SDRAM原理详解

本篇文章包含的内容 一、DDR3简介1.1 DDR3 SDRAM概述1.2 SDRAM的基础结构 二、 SDRAM操作时序2.1 SDRAM操作指令2.2 模式寄存器&#xff08;LOAD MODE REGISTER&#xff09;2.3 SDRAM操作时序示例2.3.1 SDRAM初始化时序2.3.2 突发读时序2.3.3 随机读时序2.3.4 突发写时序2.3.5 …

Java基础-接口

文章目录 1.快速入门代码&#xff1a;结果&#xff1a; 2.接口基本介绍1.语法注意&#xff1a;在jdk1.8以后接口才可以有静态方法&#xff0c;默认方法 2.代码实例 3.接口的应用场景1.场景介绍2.代码实例4.接口使用细节 5.接口课堂练习题目&#xff1a;答案&#xff1a;注意&am…

深入理解,java标识符?类型转换?

1、标识符 下面这张图是中国的一些姓氏 中国人起名字的规则都是以姓开头&#xff0c;名结尾。通过这个规则可以起&#xff1a;刘爱国、张三等&#xff0c;都是以汉字起的。但是不会起李ad、王123等名字&#xff0c;因为不符合规则。 所以&#xff0c;java在给变量、方法、类等…

【C++进阶】C++继承概念详解

C继承详解 一&#xff0c;继承的概念和定义1.1 继承的概念1.2 继承的定义1.3 继承关系和访问限定符 二&#xff0c;基类和派生类的对象赋值转移三&#xff0c;继承的作用域四&#xff0c;派生类的默认成员函数五&#xff0c;继承和友元&静态成员和继承六&#xff0c;菱形继…