Java自定义注解

Java自定义注解

一、Java自定注解

定义注解

package com.cloud.sample.base.annotation;import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;/*** @author: wanglin* @date: 2023-08-02 周三* @Version: 1.0* @Description:*/
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = {IsNotBlankListValidator.class})
public @interface NotBlankInList {boolean required() default false;String message() default "field not can blank";/*** 指定约束分组,在某一个分组时才执行此约束验证** @return*/Class<?>[] groups() default {};/*** payload 指定的payload,会在验证结果中携带此字段,比如:可以用于验证结果的严重等级分类** @return*/Class<? extends Payload>[] payload() default {};
}

注解验证工具类

package com.cloud.sample.base.annotation;import cn.hutool.core.lang.Assert;
import org.springframework.util.CollectionUtils;import java.lang.reflect.Field;
import java.util.List;/*** @author: wanglin* @date: 2023-08-02 周三* @Version: 1.0* @Description:*/
public class ValidatorUtil {/*** 注解验证测试** @param o*/public static void notBlank(Object o) {Field[] declaredFields = o.getClass().getDeclaredFields();for (Field declaredField : declaredFields) {boolean annotationPresent = declaredField.isAnnotationPresent(NotBlankInList.class);if (annotationPresent) {NotBlankInList annotation = declaredField.getAnnotation(NotBlankInList.class);declaredField.setAccessible(true);String name = declaredField.getName();System.out.println(name);List<?> fieldValue = null;try {Object valueObject = declaredField.get(o);Assert.isNull(valueObject, name + "不能为空!");fieldValue = (List<?>) declaredField.get(o);Assert.isTrue(fieldValue.size() > 0, name + "不能为空!!");} catch (IllegalAccessException e) {e.printStackTrace();}System.out.println(fieldValue);fieldValue.stream().forEach(e -> Assert.isTrue(!isEmptyIfStr(e), name + "不能为空!!!"));}}}/*** if null,return true** @param valueList* @return*/public static boolean isEmptyInList(List<?> valueList) {if (CollectionUtils.isEmpty(valueList)) {return true;}return valueList.stream().anyMatch(e -> isEmptyIfStr(e));}/*** <p>如果对象是字符串是否为空串,空的定义如下:</p><br>* <ol>*     <li>{@code null}</li>*     <li>空字符串:{@code ""}</li>* </ol>** <p>例:</p>* <ul>*     <li>{@code StrUtil.isEmptyIfStr(null)     // true}</li>*     <li>{@code StrUtil.isEmptyIfStr("")       // true}</li>*     <li>{@code StrUtil.isEmptyIfStr(" \t\n")  // false}</li>*     <li>{@code StrUtil.isEmptyIfStr("abc")    // false}</li>* </ul>** <p>注意:该方法与 {@link #isBlankIfStr(Object)} 的区别是:该方法不校验空白字符。</p>** @param obj 对象* @return 如果为字符串是否为空串*/public static boolean isEmptyIfStr(Object obj) {if (null == obj) {return true;} else if (obj instanceof CharSequence) {return 0 == ((CharSequence) obj).length();}return false;}/*** <p>如果对象是字符串是否为空白,空白的定义如下:</p>* <ol>*     <li>{@code null}</li>*     <li>空字符串:{@code ""}</li>*     <li>空格、全角空格、制表符、换行符,等不可见字符</li>* </ol>** <p>例:</p>* <ul>*     <li>{@code StrUtil.isBlankIfStr(null)     // true}</li>*     <li>{@code StrUtil.isBlankIfStr("")       // true}</li>*     <li>{@code StrUtil.isBlankIfStr(" \t\n")  // true}</li>*     <li>{@code StrUtil.isBlankIfStr("abc")    // false}</li>* </ul>** <p>注意:该方法与 {@link #isEmptyIfStr(Object)} 的区别是:* 该方法会校验空白字符,且性能相对于 {@link #isEmptyIfStr(Object)} 略慢。</p>** @param obj 对象* @return 如果为字符串是否为空串*/public static boolean isBlankIfStr(Object obj) {if (null == obj) {return true;} else if (obj instanceof CharSequence) {return isBlank((CharSequence) obj);}return false;}public static boolean isNotBlank(CharSequence str) {return false == isBlank(str);}public static boolean isBlank(CharSequence str) {final int length;if ((str == null) || ((length = str.length()) == 0)) {return true;}for (int i = 0; i < length; i++) {// 只要有一个非空字符即为非空字符串if (false == isBlankChar(str.charAt(i))) {return false;}}return true;}/*** 是否空白符<br>* 空白符包括空格、制表符、全角空格和不间断空格<br>** @param c 字符* @return 是否空白符* @see Character#isWhitespace(int)* @see Character#isSpaceChar(int)*/public static boolean isBlankChar(char c) {return isBlankChar((int) c);}/*** 是否空白符<br>* 空白符包括空格、制表符、全角空格和不间断空格<br>** @param c 字符* @return 是否空白符* @see Character#isWhitespace(int)* @see Character#isSpaceChar(int)*/public static boolean isBlankChar(int c) {return Character.isWhitespace(c)|| Character.isSpaceChar(c)|| c == '\ufeff'|| c == '\u202a'|| c == '\u0000'// issue#I5UGSQ,Hangul Filler|| c == '\u3164'// Braille Pattern Blank|| c == '\u2800'// MONGOLIAN VOWEL SEPARATOR|| c == '\u180e';}
}

测试

  ValidatorUtil.notBlank(dto);

二、Springboot自定义注解

原注解不变,需要使用 ConstraintValidator 进行校验,groups 和 payload这两个参数是必要的。groups可以指定注解使用的场景,一个实体类可能会在多个场合有使用,如插入,删除等。通过groups可以指定该注解在插入/删除的环境下生效。payload往往对bean进行使用。

校验类

package com.cloud.sample.base.annotation;import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.List;/*** @author: wanglin* @date: 2023-08-02 周三* @Version: 1.0* @Description:*/
public class IsNotBlankListValidator implements ConstraintValidator<NotBlankInList, List<?>> {@Overridepublic void initialize(NotBlankInList constraintAnnotation) {ConstraintValidator.super.initialize(constraintAnnotation);}/*** 自定义注解处理程序, 返回true则通过自定义注解的校验, 返回false则是没有通过自定义注解的校验,并返回自定义注解中message的内容** @param objects* @param constraintValidatorContext* @return*/@Overridepublic boolean isValid(List<?> objects, ConstraintValidatorContext constraintValidatorContext) {boolean isBlankFlag = ValidatorUtil.isEmptyInList(objects);return !isBlankFlag;}
}

关注林哥,持续更新哦!!!★,°:.☆( ̄▽ ̄)/$:.°★ 。

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

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

相关文章

安全杂记 - Linux文本三剑客之awk

目录 1.什么是AWK2.正则表达式3.语法4.内置变量示例printf命令5.复现awk经典实例(1).插入几个新字段(2).格式化空白(3).筛选IPv4地址(4).筛选给定时间范围内的日志 1.什么是AWK awk、grep、sed是linux操作文本的三大利器&#xff0c;合称文本三剑客。三者的功能都是处理文本&a…

【云原生】Yaml文件详解

目录 一、YAML 语法格式1.1查看 api 资源版本标签1.2 写一个yaml文件demo1.3 详解k8s中的port 一、YAML 语法格式 Kubernetes 支持 YAML 和 JSON 格式管理资源对象JSON 格式&#xff1a;主要用于 api 接口之间消息的传递YAML格式&#xff1a;用于配置和管理&#xff0c;YAML 是…

基于DETR (DEtection TRansformer)开发构建MSTAR雷达影像目标检测系统

关于DETR相关的实践在之前的文章中很详细地介绍过&#xff0c;感兴趣的话可以自行移步阅读即可&#xff1a; 《DETR (DEtection TRansformer)基于自建数据集开发构建目标检测模型超详细教程》 《书接上文——DETR评估可视化》 基于MSTAR雷达影像数据开发构建目标检测系统&am…

CentOS虚拟机更改屏幕锁屏时间

&#xff08;1&#xff09;点击“应用程序”&#xff0c;再点击“系统工具”&#xff0c;再点击“设置” &#xff08;2&#xff09; &#xff08;3&#xff09;在“设置”中点击“Privacy”&#xff0c;点击“锁屏”

免费实用的日记应用:Day One for Mac中文版

Day One for Mac是一款运行在Mac平台上的日记软件&#xff0c;你可以使用Day One for mac通过快速菜单栏条目、提醒系统和鼓舞人心的信息来编写更多内容&#xff0c;day one mac版还支持Dropbox同步功能&#xff0c;想要day one mac中文免费版的朋友赶紧来试试吧&#xff01; …

hive 字段注释乱码

hive 字段注释乱码: 在mysql中运行&#xff1a; alter table COLUMNS_V2 modify column COMMENT varchar(256) character set utf8;OK

【2.1】Java微服务: Nacos的使用

目录 Nacos介绍 Nacos安装 下载和安装 修改端口 启动 服务注册与发现 导入Nacos管理依赖 导入服务依赖 配置Nacos的服务地址 启动服务&#xff0c;查看已注册的服务 服务分级存储模型 分级存储模型介绍 具体结构 配置实例集群 同集群优先的负载均衡策略 服务权重配置…

Vue 整合 Element UI 、路由嵌套、参数传递、重定向、404和路由钩子(五)

一、整合 Element UI 1.1 工程初始化 使用管理员的模式进入 cmd 的命令行模式&#xff0c;创建一个名为 hello-vue 的工程&#xff0c;命令为&#xff1a; # 1、目录切换 cd F:\idea_home\vue# 2、项目的初始化&#xff0c;记得一路的 no vue init webpack hello-vue 1.2 安装…

探索未来:直播实时美颜SDK在增强现实(AR)直播中的前景

在AR直播中&#xff0c;观众可以与虚拟元素实时互动&#xff0c;为用户带来更加丰富、沉浸式的体验。那么&#xff0c;直播美颜SDK在AR中有哪些应用呢&#xff1f;下文小编将于大家一同探讨美颜SDK与AR有哪些关联。 一、AR直播与直播实时美颜SDK的结合 增强现实技术在直播中…

java 连接google cloud pubsub做消息发布和消费

pom依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-gcp-starter-pubsub</artifactId><version>1.2.7.RELEASE</version></dependency><dependency><groupId>org.spring…

【MFC】08.MFC消息,自定义消息,常用控件(MFC菜单创建大总结),工具栏,状态栏-笔记

本专栏上几篇文章讲解了MFC几大机制&#xff0c;今天带领大家学习MFC自定义消息以及常用控件&#xff0c;最常用的控件请查看本专栏第一二篇文章&#xff0c;今天这篇文章介绍工具栏&#xff0c;菜单和状态栏&#xff0c;以及菜单创建大总结。 文章目录 MFC消息分类&#xff1…

【Sa-Token】9、Sa-Token实现在线用户管理功能

尽管框架将大部分操作提供了简易的封装&#xff0c;但在一些特殊场景下&#xff0c;我们仍需要绕过框架&#xff0c;直达数据底层进行一些操作。 1、官方文档 会话查询 https://sa-token.cc/doc.html#/up/search-sessionSa-Token提供以下API助你直接操作会话列表&#xff1a…

【EI复现】售电市场环境下电力用户选择售电公司行为研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

如何在MongoDB中添加新用户

如何在MongoDB中添加新用户&#xff1f; MongoDB是一款流行的NoSQL数据库&#xff0c;它的可扩展性强&#xff0c;可进行分布式部署&#xff0c;且具有高可用性。其许多优势使得越来越多的企业和组织选择MongoDB作为其数据库系统。本文将介绍如何在MongoDB中添加新用户。 第一步…

网页版Java五子棋项目(一)websocket【服务器给用户端发信息】

网页版Java五子棋项目&#xff08;一&#xff09;websocket【服务器给用户端发信息】 一、为什么要用websocket二、websocket介绍原理解析 三、代码演示1. 创建后端api&#xff08;TestAPI&#xff09;新增知识点&#xff1a;extends TextWebSocketHandler重写各种方法 2. 建立…

回顾 OWASP 机器学习十大风险

日复一日&#xff0c;越来越多的机器学习 (ML) 模型正在开发中。机器学习模型用于查找训练数据中的模式&#xff0c;可以产生令人印象深刻的检测和分类能力。机器学习已经为人工智能的许多领域提供了动力&#xff0c;包括情感分析、图像分类、面部检测、威胁情报等。 数十亿美…

生活小妙招之UE custom Decal

因为这几年大部分时间都在搞美术&#xff0c;所以博客相关的可能会鸽的比较多&#xff0c;阿巴阿巴 https://twitter.com/Tuatara_Games/status/1674034744084905986 之前正好看到一个贴花相关的小技巧&#xff0c;正好做一个记录&#xff0c;也在这个的基础上做一些小的拓展…

微信小程序前后页面传值

微信小程序前后页面传值 从前一个页面跳转到下一个页面&#xff0c;如何传递参数&#xff1f;从后一个页面返回前一个页面&#xff0c;如何回调参数&#xff1f; 向后传值 从前一个页面跳转到下一个页面并传值。 前页面&#xff1a;在跳转链接中添加参数并传递 wx.navigat…

MySQL体系结构和存储引擎【InnoDB特性】【4种隔离级别】【聚集索引】

1.概念 1.1 数据库 文件的集合 1.2 数据库实例 程序 1.3 数据库 & 数据库实例的关系 应用程序通过数据库实例和数据库打交道 2.InnoDB存储引擎 2.1 特性 2.1.1 支持事务 2.1.2 具有行锁设计 默认的读取操作不会产生锁 2.1.3 支持外键 2.1.4 通过多版本并发&am…

compile_and_runtime_not_namespaced_r_class_jar\debug\R.jar: 另一个程序正在使用

问题情况&#xff1a; run App的时候&#xff0c;提示该文件被占用 想要clean Project&#xff0c;还是提示该文件被占用&#xff0c;这个文件和连带的文件夹都无法被删除。 方法1&#xff1a; AndroidStudio下方的terminal&#xff08;没有这个窗口的话&#xff0c;从上面的…