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

SpringBoot打印詳細啟動異常信息

 更新時間:2021年06月29日 10:29:28   作者:恒宇少年  
這篇文章主要介紹了SpringBoot打印詳細啟動異常信息,本文包含了詳細的過程解析與案例,概要的說明了如何去使用打印啟動異常信息,需要的朋友可以參考下

SpringBoot在項目啟動時如果遇到異常并不能友好的打印出具體的堆棧錯誤信息,我們只能查看到簡單的錯誤消息,以致于并不能及時解決發(fā)生的問題,針對這個問題SpringBoot提供了故障分析儀的概念(failure-analyzer),內部根據不同類型的異常提供了一些實現,我們如果想自定義該怎么去做?

FailureAnalyzer

SpringBoot提供了啟動異常分析接口FailureAnalyzer,該接口位于org.springframework.boot.diagnosticspackage內。內部僅提供一個分析的方法,源碼如下所示:

@FunctionalInterface
public interface FailureAnalyzer {

    /**
     * Returns an analysis of the given {@code failure}, or {@code null} if no analysis
     * was possible.
     * @param failure the failure
     * @return the analysis or {@code null}
     */
    FailureAnalysis analyze(Throwable failure);

}

接口會把遇到的異常對象實例Throwable failure交付給實現類,實現類進行自定義處理。

AbstractFailureAnalyzer

AbstractFailureAnalyzer是FailureAnalyzer的基礎實現抽象類,實現了FailureAnalyzer定義的analyze(Throwable failure)方法,并提供了一個指定異常類型的抽象方法analyze(Throwable rootFailure, T cause),源碼如下所示:

public abstract class AbstractFailureAnalyzer<T extends Throwable> implements FailureAnalyzer {

    @Override
    public FailureAnalysis analyze(Throwable failure) {
        T cause = findCause(failure, getCauseType());
        if (cause != null) {
            return analyze(failure, cause);
        }
        return null;
    }

    /**
     * Returns an analysis of the given {@code rootFailure}, or {@code null} if no
     * analysis was possible.
     * @param rootFailure the root failure passed to the analyzer
     * @param cause the actual found cause
     * @return the analysis or {@code null}
     */
    protected abstract FailureAnalysis analyze(Throwable rootFailure, T cause);

    /**
     * Return the cause type being handled by the analyzer. By default the class generic
     * is used.
     * @return the cause type
     */
    @SuppressWarnings("unchecked")
    protected Class<? extends T> getCauseType() {
        return (Class<? extends T>) ResolvableType.forClass(AbstractFailureAnalyzer.class, getClass()).resolveGeneric();
    }

    @SuppressWarnings("unchecked")
    protected final <E extends Throwable> E findCause(Throwable failure, Class<E> type) {
        while (failure != null) {
            if (type.isInstance(failure)) {
                return (E) failure;
            }
            failure = failure.getCause();
        }
        return null;
    }

}

通過AbstractFailureAnalyzer源碼我們可以看到,它在實現于FailureAnalyzer的接口方法內進行了特殊處理,根據getCauseType()方法獲取當前類定義的第一個泛型類型,也就是我們需要分析的指定異常類型。

獲取泛型異常類型后根據方法findCause判斷Throwable是否與泛型異常類型匹配,如果匹配直接返回給SpringBoot進行注冊處理。

SpringBoot提供的分析實現

SpringBoot內部通過實現AbstractFailureAnalyzer抽象類定義了一系列的針對性異常類型的啟動分析,如下圖所示:

指定異常分析

SpringBoot內部提供的啟動異常分析都是指定具體的異常類型實現的,最常見的一個錯誤就是端口號被占用(PortInUseException),雖然SpringBoot內部提供一個這個異常的啟動分析,我們也是可以進行替換這一異常分析的,我們只需要創(chuàng)建PortInUseException異常的AbstractFailureAnalyzer,并且實現類注冊給SpringBoot即可,實現自定義如下所示:

/**
 * 端口號被占用{@link PortInUseException}異常啟動分析
 *
 * @author 恒宇少年
 */
public class PortInUseFailureAnalyzer extends AbstractFailureAnalyzer<PortInUseException> {
    /**
     * logger instance
     */
    static Logger logger = LoggerFactory.getLogger(PortInUseFailureAnalyzer.class);

    @Override
    protected FailureAnalysis analyze(Throwable rootFailure, PortInUseException cause) {
        logger.error("端口被占用。", cause);
        return new FailureAnalysis("端口號:"   cause.getPort()   "被占用", "PortInUseException", rootFailure);
    }
}

注冊啟動異常分析

在上面我們只是編寫了指定異常啟動分析,我們接下來需要讓它生效,這個生效方式比較特殊,類似于自定義SpringBoot Starter AutoConfiguration的形式,我們需要在META-INF/spring.factories文件內進行定義,如下所示:

org.springframework.boot.diagnostics.FailureAnalyzer=\
  org.minbox.chapter.springboot.failure.analyzer.PortInUseFailureAnalyzer

那我們?yōu)槭裁葱枰褂眠@種方式定義呢?

項目啟動遇到的異常順序不能確定,很可能在Spring IOC并未執(zhí)行初始化之前就出現了異常,我們不能通過@Component注解的形式使其生效,所以SpringBoot提供了通過spring.factories配置文件的方式定義。

啟動異常分析繼承關系

自定義的運行異常一般都是繼承自RuntimeException,如果我們定義一個RuntimeException的異常啟動分析實例會是什么效果呢?

/**
 * 項目啟動運行時異常{@link RuntimeException}統一啟動分析
 *
 * @author 恒宇少年
 */
public class ProjectBootUnifiedFailureAnalyzer extends AbstractFailureAnalyzer<RuntimeException> {
    /**
     * logger instance
     */
    static Logger logger = LoggerFactory.getLogger(ProjectBootUnifiedFailureAnalyzer.class);

    @Override
    protected FailureAnalysis analyze(Throwable rootFailure, RuntimeException cause) {
        logger.error("遇到運行時異常", cause);
        return new FailureAnalysis(cause.getMessage(), "error", rootFailure);
    }
}

將該類也一并注冊到spring.factories文件內,如下所示:

org.springframework.boot.diagnostics.FailureAnalyzer=\
  org.minbox.chapter.springboot.failure.analyzer.PortInUseFailureAnalyzer,\
  org.minbox.chapter.springboot.failure.analyzer.ProjectBootUnifiedFailureAnalyzer

運行項目并測試端口號被占用異常我們會發(fā)現,并沒有執(zhí)行ProjectBootUnifiedFailureAnalyzer內的analyze方法,而是繼續(xù)執(zhí)行了PortInUseFailureAnalyzer類內的方法。

那我們將PortInUseFailureAnalyzer這個啟動分析從spring.factories文件內暫時刪除掉,再來運行項目我們會發(fā)現這時卻是會執(zhí)行ProjectBootUnifiedFailureAnalyzer類內分析方法。

總結

根據本章我們了解了SpringBoot提供的啟動異常分析接口以及基本抽象實現類的運作原理,而且啟動異常分析存在分析泛型異常類的上下級繼承關系,異常子類的啟動分析會覆蓋掉異常父類的啟動分析,如果你想包含全部異常的啟動分析可以嘗試使用Exception作為AbstractFailureAnalyzer的泛型參數。

到此這篇關于SpringBoot打印詳細啟動異常信息的文章就介紹到這了,更多相關SpringBoot打印啟動異常信息內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 聊聊springboot靜態(tài)資源加載的規(guī)則

    聊聊springboot靜態(tài)資源加載的規(guī)則

    這篇文章主要介紹了springboot靜態(tài)資源加載的規(guī)則,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Mybatis select記錄封裝的實現

    Mybatis select記錄封裝的實現

    這篇文章主要介紹了Mybatis select記錄封裝的實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-10-10
  • JDK1.8中ConcurrentHashMap中computeIfAbsent死循環(huán)bug問題

    JDK1.8中ConcurrentHashMap中computeIfAbsent死循環(huán)bug問題

    這篇文章主要介紹了JDK1.8中ConcurrentHashMap中computeIfAbsent死循環(huán)bug,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-08-08
  • web 容器的設計如何實現

    web 容器的設計如何實現

    這篇文章主要介紹了web 容器的設計如何實現的相關資料,本文旨在介紹如何設計一個web容器,只探討實現的思路,并不涉及過多的具體實現。把它分解劃分成若干模塊和組件,每個組件模塊負責不同的功能,需要的朋友可以參考下
    2016-12-12
  • Maven重復依賴問題解決(同一個jar多個版本)

    Maven重復依賴問題解決(同一個jar多個版本)

    本文主要介紹了Maven重復依賴問題解決(同一個jar多個版本),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-06-06
  • SpringBoot+MyBatis整合ClickHouse實踐記錄

    SpringBoot+MyBatis整合ClickHouse實踐記錄

    本文介紹了如何使用SpringBoot、MyBatis和ClickHouse整合,包括添加依賴、配置數據源、創(chuàng)建實體類、Mapper接口、服務層和控制器的步驟,通過這些步驟,可以使Java應用程序高效地與ClickHouse數據庫進行交互,感興趣的朋友跟隨小編一起看看吧
    2024-12-12
  • Java中的對稱加密詳解

    Java中的對稱加密詳解

    大家好,本篇文章主要講的是Java中的對稱加密詳解,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-01-01
  • Java-URLDecoder、URLEncoder使用及說明

    Java-URLDecoder、URLEncoder使用及說明

    本文介紹了Java中URLDecoder和URLEncoder類的使用方法,包括編碼和解碼規(guī)則、推薦的編碼方案、解碼器處理非法字符的方法以及URL編碼和解碼的示例
    2024-12-12
  • Java實現和電腦玩剪刀石頭布游戲

    Java實現和電腦玩剪刀石頭布游戲

    這篇文章主要為大家詳細介紹了Java實現和電腦玩剪刀石頭布游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • MyBatis處理mysql主鍵自動增長出現的不連續(xù)問題解決

    MyBatis處理mysql主鍵自動增長出現的不連續(xù)問題解決

    本文主要介紹了MyBatis處理mysql主鍵自動增長出現的不連續(xù)問題解決,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09

最新評論

诏安县| 旌德县| 白朗县| 海盐县| 辛集市| 抚远县| 宁乡县| 临桂县| 改则县| 寻甸| 怀远县| 阿图什市| 沈阳市| 鄱阳县| 旌德县| 沙坪坝区| 房产| 新建县| 涞源县| 上饶市| 康保县| 青冈县| 兰西县| 阜宁县| 隆德县| 龙江县| 建始县| 巴马| 西安市| 溧阳市| 昔阳县| 聂荣县| 西乌珠穆沁旗| 孝感市| 汪清县| 郓城县| 龙川县| 贺州市| 苍南县| 富平县| 新建县|