springboot自定义校验注解的实现

news2024/11/16 3:25:44

自定义校验注解的实现

  • 通过谷粒商城项目学习了自定义校验器的实现
  • 一、编写自定义校验注解
  • 二、自定义注解的校验器
  • 三、关联自定义的校验器和自定义的校验注解
  • 总结


通过谷粒商城项目学习了自定义校验器的实现

近日在学习雷神的谷粒商城项目,其中有一个自定义校验的实现,记录一下学习的过程。下面是自定义校验实现的三个过程。


提示:以下是本篇文章正文内容,下面案例可供参考

一、编写自定义校验注解

1.假如我们要自定义一个校验注解,该注解是判断该字段是否为0,1。如果不是0或者1,则校验报错。

@ListValue(vals={0,1})
private Integer showStatus;

2.进行自定义注解的创建,注意创建类型为Annotation
在这里插入图片描述


3.查看其它自定义注解,发现都有三个元数据

String message() default "{javax.validation.constraints.NotBlank.message}";

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

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

将这三条数据编写进入自定义注解里面


4.因为我们自定义注解还包含了vals这个数组,所以我们需要创建一个这样的数据数据。

int[] vals() default {};

5.引入相关的注解,观看其他注解,发现基本上实现了下面的注解

@Documented
@Constraint(
        validatedBy = {ListValueConstraintValidator.class}//使用哪个注解校验器
)
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})//在那些上面可以使用,方法,字段等
@Retention(RetentionPolicy.RUNTIME)//运行时获取

下面是自定义注解整个代码的实现:

package com.atguigu.common.valid;

import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;

@Documented
@Constraint(
        validatedBy = {ListValueConstraintValidator.class}
)
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
public @interface ListValue {
    String message() default "{com.atguigu.common.valid.ListValue.message}";

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

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

    int[] vals() default {};
}


二、自定义注解的校验器

1.在自定义注解里面,有一个引用哪个校验器的字段validatedBy,点进去看一下,发现实现了这个接口:ConstraintValidator在这里插入图片描述

2.创建一个自定义校验器,实现上面的校验器接口
在这里插入图片描述

implements ConstraintValidator<ListValue,Integer>//第一个字段写入自定义注解的名字,第二个我们校验的属性是Integer类型,所以填入Integer

3.ConstraintValidator的实现,有两个方法,一个是初始化,一个是校验

    private Set<Integer> set = new HashSet<>();
    //初始化方法
    @Override
    public void initialize(ListValue constraintAnnotation) {
        int[] vals = constraintAnnotation.vals();//包含咱们自定义注解中的vals的值[0,1]
        for (int val : vals) {
            set.add(val);
        }
    }

    //判断是否校验成功

    /**
     *
     * @param integer 需要判断的值,比如传入3,是否符合0,1状态
     * @param constraintValidatorContext
     * @return
     */
    @Override
    public boolean isValid(Integer integer, ConstraintValidatorContext constraintValidatorContext) {
        return set.contains(integer);
    }

三、关联自定义的校验器和自定义的校验注解

在自定义注解里面引入自定义注解的校验器

validatedBy = {ListValueConstraintValidator.class【可以指定多个校验器,校验不同类型的值】}

总结

自定义校验的实现三个步骤

  •  1).编写一个自定义的校验注解
    
  •  2).编写一个自定义的校验器
    
  •  3).关联自定义的校验器和自定义的校验注解validatedBy = {ListValueConstraintValidator.class【可以指定多个校验器,校验不同类型的值】}
    

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

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

相关文章

力扣日记11.30-【二叉树篇】平衡二叉树

力扣日记&#xff1a;【二叉树篇】平衡二叉树 日期&#xff1a;2023.11.30 参考&#xff1a;代码随想录、力扣 110. 平衡二叉树 题目描述 难度&#xff1a;简单 给定一个二叉树&#xff0c;判断它是否是高度平衡的二叉树。 本题中&#xff0c;一棵高度平衡二叉树定义为&#…

【LeetCode】每日一题 2023_11_29 无限集中的最小数字(哈希/堆)

文章目录 刷题前唠嗑题目&#xff1a;无限集中的最小数字题目描述代码与解题思路偷看大佬题解 结语 刷题前唠嗑 LeetCode&#xff1f;启动&#xff01;&#xff01;&#xff01; 今天的题目也比较的简单&#xff0c;因为数据量不大&#xff0c;所以什么做法都能过的去 题目&a…

java 对象大小计算

说明&#xff1a; 对于64位机&#xff1a;一个对象由三部分组成 对象头(object header) mark word &#xff1a;64bitkclass pointer &#xff1a;32bit(默认使用指针压缩)&#xff0c;如果取消指针压缩( XX:-UseCompressedOops)&#xff0c;则占用64bit数组长度&#xff1a;数…

Linux:docker镜像的创建(5)

1.基于已有镜像创建 步骤&#xff1a; 1.将原始镜像加入容器并运行 2.在原始镜像中部署各种服务 3.退出容器 4.使用下面命令将容器生成新的镜像 现在我们在这个容器里做了一些配置&#xff0c;我们要把他做成自己镜像 docker commit -m "centos7_123" -a "tarr…

ArkTS-DevEco Studio打开预览器报错

下载官网Codelab案例&#xff0c;打开预览器报错 Failed to start the service process. Make sure the path specified by nodejs.dir in the local.properties file is correct. 解决方案 在编辑器设置中找到node安装路径 将" local.properties"文件中的"nod…

老泮识趣:难忘何家桥

回忆何家桥往事&#xff0c;写了篇《消失的何家桥》&#xff0c;没想到点击率如此高&#xff0c;出乎意料。网友的共鸣可见&#xff0c;城市发展的今天&#xff0c;乡情是个美好的存在&#xff0c;清贫、朴实&#xff0c;丝毫不影响美感。由于大家的鼓励&#xff0c;触动了我再…

电力变压器行业分析:预计2029年将达到84亿元

随着中国“节能降耗”政策的不断深入&#xff0c;国家鼓励发展节能型、低噪音、智能化的配电变压器产品。在网运行的部分高能耗配电变压器已不符合行业发展趋势&#xff0c;面临着技术升级、更新换代的需求&#xff0c;未来将逐步被节能、节材、环保、低噪音的变压器所取代。 电…

PyBullet安装与学习

PyBullet 支持加载 URDF、SDF、MJCF 等多种机器人描述文件&#xff0c;并提供正/逆向运动学、正/逆向动力学、碰撞检测、射线相交查询等功能。 pip install pybullet 安装后会在 Python 环境的 lib/site-packages 中出现以下文件夹&#xff1a; pybullet_data&#xff1a;存放…

VERAS:AI驱动的Revit可视化渲染插件

Veras 是一款基于生成式AI 的可视化工具&#xff0c;可以使用自然语言生成3D渲染效果&#xff0c;兼容Revit、Rhino 和 SketchUp。Veras for Revit工具使用 Revit 模型内部的 3D 视图。 NSDT工具推荐&#xff1a; Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编…

Spine深入学习 —— 换装

Spine深入学习————换装 数据对象和实例对象的关系与区别 数据对象是无状态的&#xff0c;可在任意数量的骨架实例间共用。有对应实例数据的数据对象类名称以“Data”结尾&#xff0c;没有对应实例数据的数据对象则没有后缀&#xff0c;如附件、皮肤及动画。 实例对象有许…

【FMC140】 基于VITA57.4标准的双通道5.2GSPS(或单通道10.4GSPS)射频采样FMC+子卡模块

板卡概述 FMC140是一款具有缓冲模拟输入的低功耗、12位、双通道&#xff08;5.2GSPS/通道&#xff09;、单通道10.4GSPS、射频采样ADC模块&#xff0c;该板卡为FMC标准&#xff0c;符合VITA57.1规范&#xff0c;该模块可以作为一个理想的IO单元耦合至FPGA前端&#xff0c;8通道…

【嵌入式Linux开发一路清障-连载04】虚拟机VirtualBox7.0安装Ubuntu22.04后挂载Windows平台共享文件夹

虚拟机安装Ubuntu22.04后挂载Windows平台共享文件夹 障碍07-虚拟机VirtualBox7.0完装完Ubuntu22.04后&#xff0c;无法成功挂载Windows平台中共享文件夹&#xff0c;无法访问电脑中的各类重要文件&#xff0c;我该怎么办&#xff1f;一、问题的模样&#xff1a;VirtualBox7.0设…

Python异常处理:try...except语句

Python是一门非常灵活且易于学习的编程语言&#xff0c;在日常开发中被广泛应用。然而&#xff0c;由于各种原因&#xff0c;我们的代码可能会出现异常情况&#xff0c;例如输入错误、文件读写异常等等。Python异常处理是Python中重要的一部分&#xff0c;为了保证程序的稳定性…

IPv6地址介绍

当前我国的网络正在快速向IPv6升级中&#xff0c;从网络基础设施如运营商骨干网、城域网&#xff0c;到互联网服务商如各类云服务&#xff0c;以及各类终端设备厂商如手机、电脑、路由器、交换机等。 一、网络IP地址 IP地址是英文Internet Protocol的缩写&#xff0c;是网络之…

Fiddler 抓包高级进阶

Fiddler 抓包高级进阶 安装直接下载我附件提供的,中文版的,可以直接使用。如果不能使用就安装.NET 框架。 HTTPS配置工具》》选项: https 都配置上。 配置HTTS证书,然后动作》》 Trust Root Certificate 。 一路确认或者 是,就行了。

【C++】程序题( STL标准模板库)

&#x1f383;个人专栏&#xff1a; &#x1f42c; 算法设计与分析&#xff1a;算法设计与分析_IT闫的博客-CSDN博客 &#x1f433;Java基础&#xff1a;Java基础_IT闫的博客-CSDN博客 &#x1f40b;c语言&#xff1a;c语言_IT闫的博客-CSDN博客 &#x1f41f;MySQL&#xff1a…

dbCAN碳水化合物酶基因数据库及run_dbCAN4工具安装配置及使用

dbCAN&#xff08;碳水化合物酶基因数据库&#xff09;是一个专门用于在基因组中预测碳水化合物酶基因的在线工具。它基于隐马尔可夫模型&#xff08;HMM&#xff09;和BLAST搜索&#xff0c;能够在蛋白质序列中识别和注释不同类型的碳水化合物酶基因&#xff0c;包括纤维素酶、…

Flutter App混淆加固、保护与优化原理

目录 引言 一、混淆原理 二、实现混淆 2.1、混淆Dart代码 2.2、混淆Android原生代码 三、优化应用程序包体积 3.1、移除未使用的资源 3.2、压缩图片资源 四、提高反编译难度 4.1、混淆字符串 代码加固 五、常见问题与解决方案 六、总结 引言 在移动应用程序开发中&…

【Vue】【uni-app】实现工单列表项详情页面

这次主要实现的是一个工单详情页面 从工单列表项中点击详情 跳转到工单详情页面&#xff0c;这个详情页面就是这次我们要实现的页面&#xff0c;并可以通过点击这个关闭按钮返回到工单列表页面 首先是在我们原有的工单列表页面的按钮增加一个点击跳转 <button size"m…

支付宝蚂蚁庄园2023年12月1日小课堂问题今天正确答案是什么?通常来说榴莲的气味越浓郁说明?为什么冬天容易手脚冰凉?

问题&#xff1a;通常来说&#xff0c;榴莲的气味越浓郁说明&#xff1f; 选项&#xff1a;A、越成熟 B、越生涩 答案&#xff1a;越成熟 解析&#xff1a;榴莲都会有独特的香味,一般情况下,香味越浓郁就说明榴莲的成熟度越高,它的果肉会越香甜,吃起来会更美味。 问题&#…