最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring?Assert?使用全面指南

 更新時間:2025年09月15日 10:58:20   作者:mobaiQAQ  
本文旨在說明org.springframework.util包下的Assert類的作用、它與org.junit包下的Assert有何不同,以及它如何幫助我們簡化日常開發(fā),使代碼更加優(yōu)雅,感興趣的朋友跟隨小編一起看看吧

在Spring框架中,Assert類主要用于在開發(fā)過程中對代碼進行驗證,確保程序的正確性和穩(wěn)定性。Assert類屬于org.springframework.util包。它提供了一系列靜態(tài)方法,用于在運行時檢測條件是否滿足,如果不滿足則拋出IllegalArgumentException異常。這對于參數(shù)校驗、狀態(tài)檢查等場景非常有用。

Assert

寫在前面

這篇文檔原本并不在我的計劃之內(nèi)。我原本打算先完成 Spring AI 框架篇的內(nèi)容,但那一部分的文檔進展不太順利,暫時難以成文。最近在研究 Spring AI 框架源碼的過程中,我發(fā)現(xiàn) Spring 團隊大量使用了 Assert 類來校驗方法參數(shù)的規(guī)范性。深入研究之后,我發(fā)現(xiàn)這個類非常實用,并且它與 org.junit 包下的 Assert 類有很大區(qū)別。本文旨在說明 org.springframework.util 包下的 Assert 類的作用、它與 org.junit 包下的 Assert 有何不同,以及它如何幫助我們簡化日常開發(fā),使代碼更加優(yōu)雅。

一、Assert是什么

在 Spring 框架中,Assertorg.springframework.util 包下的一個工具類,它通過一系列靜態(tài)方法實現(xiàn)對方法參數(shù)、對象狀態(tài)或業(yè)務(wù)邏輯前提的校驗。其核心設(shè)計思想是:在程序運行時主動檢查關(guān)鍵條件是否滿足,若不滿足則立即拋出異常,快速暴露問題,避免錯誤在后續(xù)流程中被掩蓋或放大

簡單來說,Assert 的作用可以概括為 “條件校驗 + 異常拋出的自動化封裝”,僅專注于 “校驗” 這一單一職責。它替代了傳統(tǒng)開發(fā)中 “if (!條件) { throw new 異常(...); }” 這種重復(fù)的校驗邏輯,用更簡潔的代碼表達校驗意圖,讓開發(fā)者能更專注于核心業(yè)務(wù)邏輯。

二、Assert怎么用

接下來讓我們來舉個例子說明這一點,在不使用 Assert 之前,我們大多數(shù)業(yè)務(wù)代碼中的數(shù)據(jù)校驗是這樣做的

List<ChatMemory> list = chatMemoryMapper.selectBySessionId("111");
if (list == null || list.isEmpty()){
    throw new RuntimeException("會話不存在");
}
//下面處理會話相關(guān)邏輯

判斷一個數(shù)據(jù)是否存在,如果存在繼續(xù)下面的業(yè)務(wù)代碼,如果不存在則拋出異常讓外層捕獲處理

使用Assert來進行處理是這樣子的

List<ChatMemory> list = chatMemoryMapper.selectBySessionId("111");
Assert.notEmpty(list, "會話不存在");
//下面處理會話相關(guān)邏輯

Assert.notEmpty()方法的實現(xiàn)如下

@Contract("null, _ -> fail")
public static void notEmpty(@Nullable Collection<?> collection, String message) {
    if (CollectionUtils.isEmpty(collection)) {
        throw new IllegalArgumentException(message);
    }
}

Assert 類本身不包含任何業(yè)務(wù)邏輯,僅專注于 “校驗” 這一單一職責。它的所有方法均為靜態(tài)方法,無需實例化即可直接調(diào)用(如 Assert.notNull(obj, "對象不能為空")),且校驗失敗時會拋出 IllegalArgumentException(參數(shù)不合法)或 IllegalStateException(狀態(tài)不合法)等運行時異常。

雖然拋出異常需要處理,但也不應(yīng)在所有業(yè)務(wù)接口中都重復(fù)編寫 try-catch 代碼,否則會降低代碼的可讀性并導(dǎo)致冗余??蓪?code>Assert與 Spring MVC 的全局異常處理器結(jié)合使用

@ControllerAdvice
public class GlobalExceptionHandler {
    /**
     * 處理Assert拋出的IllegalArgumentException異常
     */
    @ExceptionHandler(IllegalArgumentException.class)
    @ResponseBody
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    public Map<String, Object> handleIllegalArgumentException(IllegalArgumentException e) {
        Map<String, Object> result = new HashMap<>();
        result.put("code", 400);
        result.put("message", e.getMessage());
        // 可以根據(jù)需要添加更多信息,如時間戳、請求路徑等
        return result;
    }
    /**
     * 處理Assert拋出的IllegalStateException異常
     */
    @ExceptionHandler(IllegalStateException.class)
    @ResponseBody
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    public Map<String, Object> handleIllegalStateException(IllegalStateException e) {
        Map<String, Object> result = new HashMap<>();
        result.put("code", 500);
        result.put("message", e.getMessage());
        return result;
    }
}

Assert 校驗失敗拋出異常(如 IllegalArgumentException)時,全局異常處理器會捕獲并處理這些異常。這種做法的優(yōu)勢在于:

  1. 職責分離:業(yè)務(wù)代碼只關(guān)注參數(shù)校驗邏輯,異常處理邏輯集中在全局異常處理器中
  2. 代碼簡潔:避免了大量重復(fù)的if-elsetry-catch代碼
  3. 統(tǒng)一格式:所有異常響應(yīng)都遵循統(tǒng)一格式,便于前端處理
  4. 易于維護:異常處理邏輯集中管理,修改時只需調(diào)整一處

通過這種方式,我們既利用了 Assert 的簡潔校驗?zāi)芰?,又通過全局異常處理器實現(xiàn)了異常的統(tǒng)一管理,讓代碼更加優(yōu)雅、易讀和易維護。

三、Assert有哪些方法

分類方法簽名作用描述參數(shù)說明拋出異常示例代碼
對象校驗notNull(Object object, String message)檢查對象不為 null,若為 null 則失敗object:待校驗對象;message:失敗提示信息IllegalArgumentExceptionAssert.notNull(user, "用戶對象不能為空");
isNull(Object object, String message)檢查對象必須為 null,若不為 null 則失?。ㄌ厥鈭鼍坝茫?/td>notNullIllegalArgumentExceptionAssert.isNull(deletedUser, "已刪除用戶應(yīng)不存在");
集合 / 數(shù)組校驗notEmpty(Collection<?> collection, String message)檢查集合不為 null 且非空(size > 0collection:待校驗集合;message:失敗提示信息IllegalArgumentExceptionAssert.notEmpty(userList, "用戶列表不能為空");
notEmpty(Object[] array, String message)檢查數(shù)組不為 null 且非空(length > 0array:待校驗數(shù)組;message:失敗提示信息IllegalArgumentExceptionAssert.notEmpty(ids, "ID數(shù)組不能為空");
noNullElements(Object[] array, String message)檢查數(shù)組中無 null 元素(數(shù)組本身可空,但非空元素不能為 null同數(shù)組 notEmptyIllegalArgumentExceptionAssert.noNullElements(names, "名稱數(shù)組不可含null");
字符串校驗hasLength(String text, String message)檢查字符串不為 null 且長度 > 0(允許全空白,如 " "text:待校驗字符串;message:失敗提示信息IllegalArgumentExceptionAssert.hasLength(username, "用戶名長度不能為0");
hasText(String text, String message)檢查字符串不為 null 且含非空白字符(trim().length > 0,排除全空白)hasLengthIllegalArgumentExceptionAssert.hasText(username, "用戶名不能為空白");
doesNotContain(String textToSearch, String substring, String message)檢查字符串 textToSearch 中不包含子串 substringtextToSearch:被檢查字符串;substring:禁止出現(xiàn)的子串;message:提示信息IllegalArgumentExceptionAssert.doesNotContain(username, "admin", "用戶名不可含'admin'");
條件校驗isTrue(boolean condition, String message)檢查布爾條件為 true,若為 false 則失敗(通用條件校驗)condition:待校驗條件;message:失敗提示信息IllegalArgumentExceptionAssert.isTrue(age >= 18, "年齡必須≥18歲");
state(boolean condition, String message)檢查對象狀態(tài)為 true(語義上用于狀態(tài)檢查,非參數(shù)校驗)isTrueIllegalStateExceptionAssert.state(order.isPaid(), "訂單未支付,不能發(fā)貨");
類型校驗isInstanceOf(Class<?> type, Object obj, String message)檢查 objtype 或其子類的實例type:預(yù)期類型;obj:待校驗對象;message:提示信息IllegalArgumentExceptionAssert.isInstanceOf(User.class, obj, "對象必須是User類型");
isAssignable(Class<?> superType, Class<?> subType, String message)檢查 subType 可賦值給 superType(即 superTypesubType 的父類)superType:父類型;subType:子類型;message:提示信息IllegalArgumentExceptionAssert.isAssignable(Number.class, Integer.class, "Integer必須是Number子類");

四、Assert與Assert的區(qū)別

org.springframework.util.Assert org.junit.Assert 的最大區(qū)別一個拋出RuntimeException 另一個拋出 Error

從設(shè)計角度看 org.springframework.util.Assert 適合用于生產(chǎn)代碼中的參數(shù)校驗、狀態(tài)檢查(業(yè)務(wù)邏輯層的前提校驗)

org.junit.Assert 適合用于測試代碼中的結(jié)果斷言(驗證測試用例的預(yù)期結(jié)果)

到此這篇關(guān)于Spring Assert 使用全面指南的文章就介紹到這了,更多相關(guān)Spring Assert 使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot集成mybatis連接oracle的圖文教程

    SpringBoot集成mybatis連接oracle的圖文教程

    這篇文章主要介紹了Spring Boot集成mybatis連接oracle的圖文教程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • 海量數(shù)據(jù)去重排序bitmap(位圖法)在java中實現(xiàn)的兩種方法

    海量數(shù)據(jù)去重排序bitmap(位圖法)在java中實現(xiàn)的兩種方法

    今天小編就為大家分享一篇關(guān)于海量數(shù)據(jù)去重排序bitmap(位圖法)在java中實現(xiàn)的兩種方法,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-02-02
  • Spring Security角色繼承分析

    Spring Security角色繼承分析

    這篇文章主要介紹了Spring Security角色繼承分析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友可以參考下
    2019-11-11
  • Spring事務(wù)傳播行為問題解決

    Spring事務(wù)傳播行為問題解決

    這篇文章主要介紹了Spring事務(wù)傳播行為問題解決,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友可以參考下
    2020-01-01
  • 系統(tǒng)運維問題排查-java內(nèi)存過高分析及說明

    系統(tǒng)運維問題排查-java內(nèi)存過高分析及說明

    本文總結(jié)了監(jiān)控Java進程內(nèi)存與線程狀態(tài)的常用命令及參數(shù),包括top排序、jmap查看內(nèi)存分布、jstat分析GC數(shù)據(jù)、jstack解析線程狀態(tài)等,強調(diào)需使用與進程一致的用戶執(zhí)行,并解析了線程狀態(tài)和內(nèi)存區(qū)域的含義
    2025-07-07
  • Spring整合Quartz Job以及Spring Task的實現(xiàn)方法

    Spring整合Quartz Job以及Spring Task的實現(xiàn)方法

    下面小編就為大家分享一篇Spring整合Quartz Job以及Spring Task的實現(xiàn)方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2017-12-12
  • idea sql的xml文件出現(xiàn)紅色警告符的處理方式

    idea sql的xml文件出現(xiàn)紅色警告符的處理方式

    這篇文章主要介紹了idea sql的xml文件出現(xiàn)紅色警告符處理方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • SpringBoot實現(xiàn)文章防盜鏈的代碼設(shè)計

    SpringBoot實現(xiàn)文章防盜鏈的代碼設(shè)計

    這篇文章主要介紹了SpringBoot實現(xiàn)文章防盜鏈的代碼設(shè)計,文中通過代碼示例講解的非常詳細,對大家實現(xiàn)文章防盜鏈功能有一定的幫助,需要的朋友可以參考下
    2024-05-05
  • @DynamicUpdate //自動更新updatetime的問題

    @DynamicUpdate //自動更新updatetime的問題

    這篇文章主要介紹了@DynamicUpdate //自動更新updatetime的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Java中Array、List、ArrayList的區(qū)別及說明

    Java中Array、List、ArrayList的區(qū)別及說明

    這篇文章主要介紹了Java中Array、List、ArrayList的區(qū)別及說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07

最新評論

晋宁县| 大方县| 德阳市| 那坡县| 海安县| 宿迁市| 铅山县| 琼中| 太湖县| 周口市| 丰原市| 郓城县| 扎囊县| 红河县| 牙克石市| 甘孜县| 黔东| 浦东新区| 罗平县| 洛阳市| 青海省| 永靖县| 察雅县| 万宁市| 札达县| 绥阳县| 阿勒泰市| 北辰区| 禹城市| 昌乐县| 南召县| 台湾省| 遂昌县| 富川| 沂源县| 孟连| 罗甸县| 宝丰县| 邻水| 开封市| 商城县|