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

Spring?Assert?使用全面指南

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

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

Assert

寫(xiě)在前面

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

一、Assert是什么

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

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

二、Assert怎么用

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

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

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

使用Assert來(lái)進(jìn)行處理是這樣子的

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

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

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

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

雖然拋出異常需要處理,但也不應(yīng)在所有業(yè)務(wù)接口中都重復(fù)編寫(xiě) try-catch 代碼,否則會(huì)降低代碼的可讀性并導(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ù)需要添加更多信息,如時(shí)間戳、請(qǐng)求路徑等
        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;
    }
}

當(dāng) Assert 校驗(yàn)失敗拋出異常(如 IllegalArgumentException)時(shí),全局異常處理器會(huì)捕獲并處理這些異常。這種做法的優(yōu)勢(shì)在于:

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

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

三、Assert有哪些方法

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

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

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

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

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

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

相關(guān)文章

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

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

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

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

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

    Spring Security角色繼承分析

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

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

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

    系統(tǒng)運(yùn)維問(wèn)題排查-java內(nèi)存過(guò)高分析及說(shuō)明

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

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

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

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

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

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

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

    @DynamicUpdate //自動(dòng)更新updatetime的問(wèn)題

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

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

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

最新評(píng)論

汉寿县| 许昌县| 乡城县| 锦屏县| 亳州市| 怀仁县| 大兴区| 泗水县| 新兴县| 满城县| 图们市| 漯河市| 南雄市| 孝义市| 明星| 蛟河市| 鱼台县| 麻栗坡县| 鄂尔多斯市| 谷城县| 西青区| 留坝县| 大化| 错那县| 衡阳市| 醴陵市| 临清市| 伊春市| 南木林县| 时尚| 百色市| 柳河县| 柘城县| 屏东市| 长沙县| 恭城| 珠海市| 裕民县| 修文县| 巴林左旗| 普兰县|