SpringBoot内置工具类之断言Assert的使用与部分解析
先例举一个service的demo中用来验证参数对象的封装方法,使用了Assert工具类后是不是比普通的 if(xxx) { throw new RuntimeException(msg) } 看上去要简洁多了?

断言Assert工具类简介
- 断言是一个判断逻辑,用来检查不该发生的情况;
- 断言的判定规则:
2.1.值为true时,程序从断言语句处继续执行;
2.2.值为false时,程序从断言语句处抛出异常,停止执行;
2.3.早在JDK的1.4版本已经引入断言assert,通过命令-enableassertions开启,通过命令-disableassertions关闭;不加参数,全局生效;加了参数,只在某个类中使用;具体可通过java help命令查看; - Springframework框架中也提供了断言工具类Assert,通常用于数据合法性验证。我们今天说的就是它。
断言Assert工具类的使用
public static void main(String[] argo){Object obj = null;Assert.isNull(obj, "对象必须为NULL,否则抛异常不予放行");Assert.notNull(new Object(), "对象不能为NULL,否则抛异常不予放行");Assert.state(true, "参数必须为true,否则抛异常不予放行");Assert.isTrue(true, "参数必须为true,否则抛异常不予放行");// null 或 空字符串 断言失败,空格断言成功Assert.hasLength(" ", "参数必须有长度,否则抛异常不予放行");// null、空字符串、纯空格断言失败Assert.hasText(" dd", "参数必须有正文,否则抛异常不予放行");Assert.doesNotContain("text", "bb", "第一个参数不能包含第二个参数,否则抛异常不予放行");Object[] objArray = {true, false,};// 除了对象数组,还有其他类型的数组,在此不在一一举例Assert.notEmpty(objArray, "对象数组不能为空,否则抛异常不予放行");Assert.noNullElements(objArray, "对象数组中不能有null元素,否则抛异常不予放行");Map<String,String> map = new HashMap<String,String>();Assert.isInstanceOf(Map.class, map, "第二个参数必须是第一个参数的实例,否则抛异常不予放行");Assert.isAssignable(Map.class, List.class, "第二个参数必须是第一个参数的子类或者实现类,否则抛异常不予放行"); System.out.println("全部断言成功~!");}
把最后一个断言设置失败时,失败的语句处抛出异常,程序在此处终止运行,运行结果如下所示:
Exception in thread "main" java.lang.IllegalArgumentException: 第二个参数必须是第一个参数的子类或者实现类,否则抛异常不予放行: interface java.util.Listat org.springframework.util.Assert.assignableCheckFailed(Assert.java:720)at org.springframework.util.Assert.isAssignable(Assert.java:651)at com.example.util.SpringUtilTest.main(SpringUtilTest.java:40)
断言Assert工具类的部分源码
import java.util.Collection;
import java.util.Map;
import java.util.function.Supplier;import org.springframework.lang.Nullable;
import org.springframework.util.CollectionUtils;
import org.springframework.util.ObjectUtils;
import org.springframework.util.StringUtils;/*** 断言工具类类* SpringBoot 2.1.4.RELEASE* 符合条件就继续执行,否则抛异常不予放行*/
public abstract class Assert {/*** 参数expression必须为true,否则抛异常,不予放行* @param expression boolean型表达式* @param message 用于定制异常消息内容*/public static void state(boolean expression, String message) {if (!expression) {throw new IllegalStateException(message);}}/*** 参数expression必须为true,否则抛异常,不予放行* @param expression* @param message*/public static void isTrue(boolean expression, String message) {if (!expression) {throw new IllegalArgumentException(message);}}/*** 要求对象object必须为null,否则抛异常,不予放行* @param object* @param message*/public static void isNull(@Nullable Object object, String message) {if (object != null) {throw new IllegalArgumentException(message);}}/*** 要求参数object不为null,否则抛异常,不予放行;* 和isNull() 方法相反* @param object* @param message*/public static void notNull(@Nullable Object object, String message) {if (object == null) {throw new IllegalArgumentException(message);}}/*** 要求参数text必须有长度,不为null且长度大于0,否则抛异常,不予放行* @param text 字符串文本* @param message*/public static void hasLength(@Nullable String text, String message) {if (!StringUtils.hasLength(text)) {throw new IllegalArgumentException(message);}}/*** 要求参数text必须有内容,否则抛异常,不予放行* @param text 字符串文本* @param message*/public static void hasText(@Nullable String text, String message) {if (!StringUtils.hasText(text)) {throw new IllegalArgumentException(message);}}/*** 要求textToSearch不包含substring,否则抛异常,不予放行* @param textToSearch 要检索的字符串文本* @param substring 被检索字符* @param message*/public static void doesNotContain(@Nullable String textToSearch, String substring, String message) {if (StringUtils.hasLength(textToSearch) && StringUtils.hasLength(substring) &&textToSearch.contains(substring)) {throw new IllegalArgumentException(message);}}/*** 要求参数array不为null,否则抛异常,不予放行* @param array 对象数组* @param message*/public static void notEmpty(@Nullable Object[] array, String message) {if (ObjectUtils.isEmpty(array)) {throw new IllegalArgumentException(message);}}/*** 要求对象数组array中没有Null元素,否则抛异常,不予放行* @param array* @param message*/public static void noNullElements(@Nullable Object[] array, String message) {if (array != null) {for (Object element : array) {if (element == null) {throw new IllegalArgumentException(message);}}}}/*** 要求集合collection不为null、不为空集合,否则抛异常,不予放行* @param collection* @param message*/public static void notEmpty(@Nullable Collection<?> collection, String message) {if (CollectionUtils.isEmpty(collection)) {throw new IllegalArgumentException(message);}}/*** 要求Map集合不为null,不为空集合,否则抛异常,不予放行* @param map the map to check* @param message the exception message to use if the assertion fails* @throws IllegalArgumentException if the map is {@code null} or contains no entries*/public static void notEmpty(@Nullable Map<?, ?> map, String message) {if (CollectionUtils.isEmpty(map)) {throw new IllegalArgumentException(message);}}/*** 要求对象obj必须是指定类type的实例,否则抛异常,不予放行* @param type* @param obj* @param message*/public static void isInstanceOf(Class<?> type, @Nullable Object obj, String message) {notNull(type, "Type to check against must not be null");if (!type.isInstance(obj)) {instanceCheckFailed(type, obj, message);}}/*** 要求对象obj必须是指定类type的实例,否则抛异常,不予放行* @param type * @param obj* @param message*/public static void isInstanceOf(Class<?> type, @Nullable Object obj) {isInstanceOf(type, obj, "");}/*** 要求参数subType必须是参数superType的子类或者实现类,否则抛出异常,不予放行* @param superType* @param subType* @param message*/public static void isAssignable(Class<?> superType, @Nullable Class<?> subType, String message) {notNull(superType, "Super type to check against must not be null");if (subType == null || !superType.isAssignableFrom(subType)) {assignableCheckFailed(superType, subType, message);}}/*** 要求参数subType必须是参数superType的子类或者实现类,否则抛出异常,不予放行* @param superType* @param subType* @param message*/public static void isAssignable(Class<?> superType, Class<?> subType) {isAssignable(superType, subType, "");}private static void instanceCheckFailed(Class<?> type, @Nullable Object obj, @Nullable String msg) {String className = (obj != null ? obj.getClass().getName() : "null");String result = "";boolean defaultMessage = true;if (StringUtils.hasLength(msg)) {if (endsWithSeparator(msg)) {result = msg + " ";}else {result = messageWithTypeName(msg, className);defaultMessage = false;}}if (defaultMessage) {result = result + ("Object of class [" + className + "] must be an instance of " + type);}throw new IllegalArgumentException(result);}private static void assignableCheckFailed(Class<?> superType, @Nullable Class<?> subType, @Nullable String msg) {String result = "";boolean defaultMessage = true;if (StringUtils.hasLength(msg)) {if (endsWithSeparator(msg)) {result = msg + " ";}else {result = messageWithTypeName(msg, subType);defaultMessage = false;}}if (defaultMessage) {result = result + (subType + " is not assignable to " + superType);}throw new IllegalArgumentException(result);}private static boolean endsWithSeparator(String msg) {return (msg.endsWith(":") || msg.endsWith(";") || msg.endsWith(",") || msg.endsWith("."));}private static String messageWithTypeName(String msg, @Nullable Object typeName) {return msg + (msg.endsWith(" ") ? "" : ": ") + typeName;}@Nullableprivate static String nullSafeGet(@Nullable Supplier<String> messageSupplier) {return (messageSupplier != null ? messageSupplier.get() : null);}
}
简单来说就是验证失败就抛出异常,终止代码的执行。
总结
Assert工具类中大约有30多个静态方法供外部类调用,它的特点就是符合条件继续执行,否则抛出IllegalArgumentException异常。这个工具类是Spring框架util包(org.springframework.util)中的工具类
参考:SpringBoot内置工具类之 断言 Assert
相关文章:
SpringBoot内置工具类之断言Assert的使用与部分解析
先例举一个service的demo中用来验证参数对象的封装方法,使用了Assert工具类后是不是比普通的 if(xxx) { throw new RuntimeException(msg) } 看上去要简洁多了? 断言Assert工具类简介 断言是一个判断逻辑,用来检查不该发生的情况ÿ…...
如何检测租用的香港服务器是不是CN2线路呢?
CN2,是中国电信新一代融合承载网络,是为电信自身关键业务和具有QoS保证的SLA业务服务的,可以提供高性能的网络指 标,平均单向时延、最大单向时延、单向丢包率等均属于顶尖水平。简单地说,CN2和普通网络,就像…...
Spring Boot进阶(94):从入门到精通:Spring Boot和Prometheus监控系统的完美结合
📣前言 随着云原生技术的发展,监控和度量也成为了不可或缺的一部分。Prometheus 是一款最近比较流行的开源时间序列数据库,同时也是一种监控方案。它具有极其灵活的查询语言、自身的数据采集和存储机制以及易于集成的特点。而 Spring Boot 是…...
Redis(02)| 数据结构-SDS
一、键值对数据库是怎么实现的? 在开始讲数据结构之前,先给介绍下 Redis 是怎样实现键值对(key-value)数据库的。 Redis 的键值对中的 key 就是字符串对象,而 value 可以是字符串对象,也可以是集合数据类型…...
HackTheBox-Starting Point--Tier 0---Preignition
文章目录 一 题目二 实验过程 一 题目 Tags Web、Custom Applications、Apache、Reconnaissance、Web Site Structure Discovery、Default Credentials译文:Web、定制应用程序、Apache、侦察、网站结构发现、默认凭证Connect To attack the target machine, you …...
售货机相关的电路
一、货道选通矩阵电路,类似扫描电路,驱动哪个电机,就打开相应的行线与列线输出 二、MDB纸币器,虽然现在国内都是手机支付,但如果机器还是外销国外还是有用 三、硬币器电路,投币与退币,脉冲信号…...
软考高项(十四)项目沟通管理 ★重点集萃★
👑 个人主页 👑 :😜😜😜Fish_Vast😜😜😜 🐝 个人格言 🐝 :🧐🧐🧐说到做到,言出必行&am…...
Linux多线程服务端编程:使用muduo C++网络库 学习笔记 第五章 高效的多线程日志
“日志(logging)”有两个意思: 1.诊断日志(diagnostic log)。即log4j、logback、slf4j、glog、g2log、log4cxx、log4cpp、log4cplus、Pantheios、ezlogger等常用日志库提供的日志功能。 2.交易日志(trasac…...
利用Pholcus框架提取小红书数据的案例分析
前言 在当今互联网时代,数据的获取和分析变得越来越重要。爬虫技术作为一种数据采集的方法,被广泛涉及各个领域。在本文中,我们将介绍如何使用Python Spark语言和Pholcus框架来实现一本小红书数据爬虫的案例分析。 开发简述 Go语言作为一种…...
超详细Hadoop安装教程(单机版、伪分布式)
超详细Hadoop安装教程(单机版、伪分布式) 1.Hadoop分布式系统基础架构介绍1.1.Hadoop核心 2.Hadoop安装教程2.1.环境准备2.2.配置用户ssh 免密登录2.3.JAVA环境的安装和配置2.4.Hadoop安装2.5.单机版Hadoop配置2.6.伪分布式Hadoop配置2.7Hadoop初始化 1.…...
持续集成部署-k8s-服务发现-Ingress
持续集成部署-k8s-服务发现-Ingress 1. Ingress 是什么2. Ingress 控制器3. 安装 Ingress-Nginx3.1 添加 Helm 仓库3.2 更新 Helm 仓库3.3 下载 Ingress-Nginx 安装包3.4 配置 Ingress-Nginx 配置文件参数3.5 安装 Ingress-Nginx1. Ingress 是什么 Ingress是 Kubernetes 中的一…...
从零开始搭建Prometheus+grafana服务器组件监控系统
服务器及相关组件监控 本文档主要记录了常用企业级服务器及各种组件的监控手段和监控部署方案,使企业可以实时感知服务器组件的健康状态,并在服务器或组件出现异常时及时做出反应。 本方案采用的Prometheusgrafana的方式实现对服务器及各种组件的监控&am…...
智能水厂运行与调控3D模拟仿真在线展示提高整个系统的协同效应
水厂在生活中的重要性不可忽视。它们提供清洁、安全的水源,满足人们饮用、洗浴、烹饪等基本需求,保障公共卫生,预防疾病传播;同时,水厂也促进经济发展,为工业生产和农业灌溉提供保障,吸引和支持企业的投资和…...
ts声明文件
1 背景 对于为第三方模块/库写声明文件之前,我们需要知道第三方模块/库,是否需要声明文件,或者是否已有声明文件。 若第三方模块/库,是ts编写且无声明文件, 可以使用--declaration配置选项来生成;可以在命…...
JPA联合主键使用
在实际工作中,我们会经常遇到联合主键的情况,所以我用简单例子列举JPA两种实现联合主键的方式。 1、如何通过IdClass 实现联合主键 第一步:新建一个UserInfoID类,里面是联合主键 Data Builder NoArgsConstructor AllArgsConstructor publi…...
【计算机毕设经典案例】基于微信小程序的图书管理系统
前言:我是IT源码社,从事计算机开发行业数年,专注Java领域,专业提供程序设计开发、源码分享、技术指导讲解、定制和毕业设计服务 👉IT源码社-SpringBoot优质案例推荐👈 👉IT源码社-小程序优质案例…...
如何制作rpm离线安装包
如何制作rpm离线安装包 在内网环境中使用rpm安装zabbix-agent-6.4.6时,发现rpm无法下载依赖 1.准备一个可以连接外网的纯净centos7环境 防止本地已有的依赖不会被重复下载 docker pull centos:7docker stop mycentos7 docker rm mycentos72.启动centos7并挂载一…...
golang中快速用melody搭建轻量的websocket服务
在Go中,可以使用gin和melody库来搭建一个轻量级的WebSocket服务。gin是一个流行的Web框架,而melody是一个用于处理WebSocket的库。以下是一个简单的示例代码,演示了如何使用gin和melody搭建WebSocket服务: package mainimport (&…...
Profinet转EtherNET/IP从站连接欧姆龙plc与西门子200smart通讯的配置方法
本案例是200smart plc与欧姆龙plc进行通讯的方法,远创智控YC-PNM-EIP网关可以读写全系列西门子 PLC 数据。一般不需要 PLC 里做特殊的设置。只需要把 PLC 的变量地址配置到网关中,网关就可以读取指定地址的数据或者写数据到指定的地址。 PLC 通过网线连接…...
elementUI el-table实现鼠标悬浮某一行,在鼠标右侧展示提示信息
背景 el-table组件中,可以通过勾选某条数据来创建单据,但是有些数据没有权限使用,就需要禁用掉勾选的功能,然后当鼠标悬浮在这一行的时候,展示类似于toolTip的提示框。 除了当鼠标悬浮在某一行,展示类似于…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...
Java - Mysql数据类型对应
Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...
CocosCreator 之 JavaScript/TypeScript和Java的相互交互
引擎版本: 3.8.1 语言: JavaScript/TypeScript、C、Java 环境:Window 参考:Java原生反射机制 您好,我是鹤九日! 回顾 在上篇文章中:CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...
06 Deep learning神经网络编程基础 激活函数 --吴恩达
深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...
【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...
华为OD机考-机房布局
import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...
「全栈技术解析」推客小程序系统开发:从架构设计到裂变增长的完整解决方案
在移动互联网营销竞争白热化的当下,推客小程序系统凭借其裂变传播、精准营销等特性,成为企业抢占市场的利器。本文将深度解析推客小程序系统开发的核心技术与实现路径,助力开发者打造具有市场竞争力的营销工具。 一、系统核心功能架构&…...
