springboot够用就好系列-1.自定义LengthJudge注解校验字段长度

news2024/11/25 18:57:42

类似@NonNull注解标注在参数之上,表示对应的值不可以为空,利用java的元注解及注解处理器实现检查属性长度的功能。

 目录

程序效果

实现过程

样例代码

参考资料


程序效果

截图1.用户名超长提示

        检查登录时“用户名”、“密码”字段的长度,此时用户名超长。

实现过程

1.注解的定义

        注解是一种能被添加到java源代码中的元数据,方法、类、参数和包都可以用注解来修饰。

        注解可以看作是一种特殊的标记,可以用在方法、类、参数和包上,程序在编译或者运行时可以检测到这些标记而进行一些特殊的处理。

2.使用到的java元注解

名称作用属性取值
@Target标识该注解用在什么地方ElementTypeFIELD:在属性上使用
METHOD:在方法上使用
PARAMETER:在参数上使用
TYPE:在类、接口或enum上使用
...
@Retention表示生效的阶段RetentionPolicySOURCE:注解在编译时被丢弃
CLASS:注解在class文件中存在,但会被JVM丢弃
RUNTIME:JVM运行时也会保留注解,可以通过反射机制获取注解信息

使用其中的:

        @Target({ElementType.FIELD}):表示对字段进行注解。

        @Retention(RetentionPolicy.RUNTIME):表示可以在运行时获取到注解参数进行判断。

3.注解处理器的常规使用

        Field[] fields = clazz.getDeclaredFields(); //获取类的字段

        LengthJudge test = field.getAnnotation(LengthJudge.class); //获取属性上的@LengthJudge注解

样例代码

1.自定义的注解“LengthJudge”

@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)

public @interface LengthJudge {
    int max() default 0;
    int min() default 0;
    String description() default "";
}

        含3个注解值,max表示接收输入的最大长度,民表示最小长度,description表示提示信息。

2.使用注解的类“LoginReq”

public class LoginReq {

	@LengthJudge(min = 6,max = 10,description = "用户名长度在6-10个字符之间")
	private String name;

	@LengthJudge(min = 6,max =10,description = "密码长度在6-10个字符之间")
	private String password;

	public String getName() {
	return name;
}

public String getPassword() {
	return password;
}

public void setName(String name) {
	this.name = name;
}

public void setPassword(String password) {
	this.password = password;
}

         用户登录的请求结构,包含“用户名”、“密码”2个字段,使用注解“LengthJudege”时注解入参传递最短最长以及报错提示描述,给后面的注解处理器使用。

3.注解处理器及main函数

public class AnnoTest {

	public static void valid(Object obj) throws IllegalAccessException {
		Class<?> clazz = obj.getClass();
		Field[] fields = clazz.getDeclaredFields();
		
		for (Field field:fields){
			LengthJudge test = field.getAnnotation(LengthJudge.class);//获取属性上的@LengthJudge注解
			if(test != null){
				field.setAccessible(true);//设置属性可访问
				if("class java.lang.String".equals(field.getGenericType().toString())){//字符串类型的才判断长度
					String value = (String)field.get(obj);

					//长度校验
					if(value != null && ((value.length() > test.max()) || value.length() < test.min())){
						System.out.println(test.description());
					}
				}
			}
		}
	}

	public static void main(String[] args) {
		LoginReq annotation = new LoginReq();
		annotation.setName("abcefg111"); //用户名超过6位
		annotation.setPassword("1234567890"); //密码长度合法
		try {
			valid(annotation);
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		}
	}
}

 参考资料

1.Java实现自定义注解

https://blog.csdn.net/zt15732625878/article/details/100061528

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

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

相关文章

安全智能分析 环境迁移

环境迁移 Platfor m Ops for AI 作为整合了 DataOps、MLOps、ModelOps 的复杂技术平台&#xff0c;在项目开发时仅使用一套系统无法支撑平台的稳定搭建&#xff0c;往往需要开发系统、集成测试系统、正式 环境系统在项目生命周期 中协作配合。将表、索引、并发程序、配置内容等…

新手想做短视频可以选择什么领域,这三个可以无脑尝试

大家好&#xff0c;我是蝶衣王的小编 对于小白来说&#xff0c;如果你想通过短视频来赚钱&#xff0c;你不能在流行的领域去做。因为坑不是你能接受的&#xff0c;而且有太多的同行&#xff0c;你的竞争优势没法显现出来。下面分享一下新手适合做的短视频领域​。 一、盘点类型…

海思嵌入式开发-001-基于Ubuntu20.04搭建开发环境

海思嵌入式开发-001-基于Ubuntu20.04搭建开发环境一、虚拟机安装ubuntu20.041、安装虚拟机VMware2、基于虚拟机安装ubuntu20.04二、开发环境配置1、参考资料2、问题汇总一、虚拟机安装ubuntu20.04 1、安装虚拟机VMware 主机配置为Windows 10系统&#xff0c;CPU为i7-8550U 4核…

虹科新闻|ATTO 宣布支持 Apple 最新操作系统 macOS® 13 Ventura

一、即时发布 近期&#xff0c;虹科的合作伙伴ATTO公司宣布支持Apple最新操作系统macOS13 Ventura&#xff0c;所有HK-ATTO适配器、软件和实用程序都已经过新操作系统的测试和验证。 ATTO 34年来为数据密集型计算环境提供网络、存储连接和基础架构解决方案的全球领导者&#…

一文读懂什么是低代码开发?

世界在应用程序上运行&#xff0c;商业世界也不例外。面对变化&#xff0c;企业过去依赖的传统应用程序开发流程可能不再有效。从头开始构建软件解决方案需要花费数月甚至数年的时间来规划、设计、测试和部署。当您的组织需要快速解决方案时&#xff0c;等待负担过重的开发人员…

真实世界的人工智能应用落地——OpenAI篇 ⛵

&#x1f4a1; 作者&#xff1a;韩信子ShowMeAI &#x1f4d8; 深度学习实战系列&#xff1a;https://www.showmeai.tech/tutorials/42 &#x1f4d8; 本文地址&#xff1a;https://www.showmeai.tech/article-detail/414 &#x1f4e2; 声明&#xff1a;版权所有&#xff0c;转…

CVE-2018-1273漏洞复现

今天继续给大家介绍渗透测试相关知识&#xff0c;本文主要内容是CVE-2018-1273漏洞复现。 免责声明&#xff1a; 本文所介绍的内容仅做学习交流使用&#xff0c;严禁利用文中技术进行非法行为&#xff0c;否则造成一切严重后果自负&#xff01; 再次强调&#xff1a;严禁对未授…

Web3中文|未来的工作模式:VR头显、元宇宙和供应商协作

根据Meta最近发布的一份关于未来工作模式的报告&#xff0c;大约三分之一的美英劳动力在进行远程办公&#xff0c;因此企业必须重新定义工作方式和管理机制&#xff0c;并探索元宇宙和虚拟现实等创新领域。 报告称&#xff1a;“这将推动企业寻求更具创造性和创新性的方法来凝…

canal中间件集成springboot实战落地

目录 一、数据库开启相关权限功能&#xff1a; 二、canal 服务端配置启动&#xff1a;从官网下载程序和源码到本地环境 三、canal客户端配置启动&#xff1a; canal中间件集成springboot实战落地开始分享&#xff0c;这是目前互联网很常见的中间件&#xff0c;监听数据库变化…

Harbor镜像仓库的安装以及Docker从Harbor上传与下载镜像

Harbor镜像仓库的安装与使用 简介&#xff1a;Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器&#xff0c;除了Harbor这个私有镜像仓库外&#xff0c;还有Docker官方提供的Registry。相对Registry&#xff0c;Harbor具有很多优势,本文主要介绍Harbor镜像仓库的安…

Serivice案例

Serivice启动方式案例 1.案例1&#xff1a;-start方式启动 1.1创建服务 //服务类 public class MyService extends Service {//创建服务调用一次Overridepublic void onCreate() {System.out.println("onCreate");Toast.makeText(this, "onCreate", Toast.…

MySQL (三)------DDL操作数据库、DDL操作表

DDL操作数据库 1.1创建数据库(掌握) 语法 create database 数据库名 [character set 字符集][collate 校对规则] 注: []意思是可选的意思 字符集(charset)&#xff1a;是一套符号和编码。 练习 创建一个day01的数据库&#xff08;默认字符集) create database day01;…

List使用的坑

Arrays.asList的三个坑 1、不能转换基本数组类型(传数组进去&#xff0c;size1) 2、不支持增删操作(因为内部是一个final的数组) 3、对原始数组的修改会影响到我们获得的那个List 源码&#xff1a; 抽象List接口不支持新增 解决方案&#xff1a; 1、new ArrayList 2、java8…

4.移动端布局-flex布局**

1、传统布局和flex布局 传统布局&#xff1a;PC端 兼容性好布局繁琐局限性&#xff0c;不能在移动端很好的布局 flex布局&#xff1a;PC端、移动端操作方便&#xff0c;布局简单&#xff0c;移动端应用广泛PC端浏览器支持情况较差IE11或更低版本&#xff0c;不支持或仅部分支…

关于加密货币危机公关的智能钱包系列:该做和不该做哪些事情

我们的新一期 Twitter Spaces 为危机公关带来了加密镜头。与我们的主持人 Megan DeMatteo 一起出席本期节目的还有 Market Across 战略与消费者成功副总裁 Kim Bazak 和 Ambire CMO Vanina Ivanova。 Ambire Twitter Spaces 第 14 集以更广泛的视角来看待 FTX/Alameda 的故事。…

virtio虚拟化框架

virtio虚拟化 系统虚拟化技术是云计算最重要的核心技术之一。云计算平台的资源池化&#xff0c;资源统一管理以及后续的动态分配都是基于系统虚拟化技术才得以实现的。在计算机系统中&#xff0c;主要有计算资源&#xff0c;存储资源和网络资源。所以&#xff0c;系统虚拟化技术…

通讯录(3)

接着上一篇。 上一篇的指定删除还有一定的问题&#xff0c;我让用户输入要删除的联系人的名字&#xff0c;然后查询这个名字是否存在&#xff0c;再去删除。但是这里忽略了一个问题&#xff0c;如果两人名字一样呢&#xff1f;其它也有这样的问题&#xff0c;年龄&#xff0…

【vant组件安装】按需引入 完整引入 定制主题

vant官网&#xff1a;https://vant-contrib.gitee.io/vant/v2/#/zh-CN/定制主题: https://vant-contrib.gitee.io/vant/v2/#/zh-CN/theme 1. vant组件安装—按需引入 1.安装vant组件库 npm i vantlatest-v22.安装按需引入组件 npm i babel-plugin-import -D3.在babel.config.j…

cadence SPB17.4 - 从正常PCB文件反推原理图

文章目录cadence SPB17.4 - 从正常PCB文件反推原理图概述笔记用SPB17.4 allegro 出报表剩余的事情最重要的一件事情 - 核对整理出的原理图是否和PCB原图网络一致最后的事情备注ENDcadence SPB17.4 - 从正常PCB文件反推原理图 概述 和同学讨论问题, 他那有一个可以正常生产的立…

2-2-3-9-1-2、jdk1.7ConcurrentHashMap详解

数据结构 对比hashmap,hashmap数组对象类型是Entry对象类型&#xff0c;而ConcurrentHashMap数组对象类型是Segment[]数组&#xff0c;segment[]数组的对象类型为HashEntry类型(一个Segment里面包含一个HashEntry数组&#xff0c;每个HashEntry是一个链表结构&#xff0c;当对…