国产成人精品亚洲777人妖,欧美日韩精品一区视频,最新亚洲国产,国产乱码精品一区二区亚洲

您的位置:首頁技術(shù)文章
文章詳情頁

Spring Boot 項(xiàng)目啟動失敗的解決方案

瀏覽:4日期:2023-07-21 10:54:40

Spring Boot 項(xiàng)目是不是經(jīng)常失敗,顯示一大堆的錯(cuò)誤信息,如端口重復(fù)綁定時(shí)會打印以下異常:

***************************APPLICATION FAILED TO START***************************Description:Embedded servlet container failed to start. Port 8080 was already in use.Action:Identify and stop the process that’s listening on port 8080 or configure this application to listen on another port.

這個(gè)大家應(yīng)該很熟悉了吧!

錯(cuò)誤信息大家都能看懂,但很不友好,那么,Spring Boot 是怎么實(shí)現(xiàn)這樣一個(gè)異常錯(cuò)誤信息輸出的呢?今天棧長分享一個(gè) Spring Boot 啟動失敗的簡單易懂的玩法,讓新來的實(shí)習(xí)生 1 秒都能看出問題。

如果你對 Spring Boot 還不是很熟悉,或者只是會簡單的使用,那還是建議你深入學(xué)習(xí)下吧,推薦這個(gè) Spring Boot 學(xué)習(xí)倉庫,歡迎 Star 關(guān)注:

https://github.com/javastacks/spring-boot-best-practice

Failure Analyzers 介紹

Spring Boot 中注冊了許多 'Failure Analyzers',即 '失敗分析器',Spring Boot 中的啟動失敗的場景都是由這些失敗分析器攔截處理的。

Spring Boot 提供了 FailureAnalyzers 接口:

package org.springframework.boot.diagnostics;/** * A {@code FailureAnalyzer} is used to analyze a failure and provide diagnostic * information that can be displayed to the user. * * @author Andy Wilkinson * @since 1.4.0 */@FunctionalInterfacepublic 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);}

這個(gè)接口的目的就是: 分析啟動失敗異常并顯示給用戶有用的診斷信息。

Spring Boot 內(nèi)置注冊的所有失敗分析器在這個(gè)文件里面:

/org/springframework/boot/spring-boot/2.3.5.RELEASE/spring-boot-2.3.5.RELEASE-sources.jar!/META-INF/spring.factories

注冊的所有失敗分析器列表:

# Failure Analyzersorg.springframework.boot.diagnostics.FailureAnalyzer=org.springframework.boot.context.properties.NotConstructorBoundInjectionFailureAnalyzer,org.springframework.boot.diagnostics.analyzer.BeanCurrentlyInCreationFailureAnalyzer,org.springframework.boot.diagnostics.analyzer.BeanDefinitionOverrideFailureAnalyzer,org.springframework.boot.diagnostics.analyzer.BeanNotOfRequiredTypeFailureAnalyzer,org.springframework.boot.diagnostics.analyzer.BindFailureAnalyzer,org.springframework.boot.diagnostics.analyzer.BindValidationFailureAnalyzer,org.springframework.boot.diagnostics.analyzer.UnboundConfigurationPropertyFailureAnalyzer,org.springframework.boot.diagnostics.analyzer.ConnectorStartFailureAnalyzer,org.springframework.boot.diagnostics.analyzer.NoSuchMethodFailureAnalyzer,org.springframework.boot.diagnostics.analyzer.NoUniqueBeanDefinitionFailureAnalyzer,org.springframework.boot.diagnostics.analyzer.PortInUseFailureAnalyzer,org.springframework.boot.diagnostics.analyzer.ValidationExceptionFailureAnalyzer,org.springframework.boot.diagnostics.analyzer.InvalidConfigurationPropertyNameFailureAnalyzer,org.springframework.boot.diagnostics.analyzer.InvalidConfigurationPropertyValueFailureAnalyzer

再回到上面的端口重復(fù)綁定啟動失敗異常,就是注冊了 PortInUseFailureAnalyzer 這個(gè)失敗分析器,可以看到 PortInUseFailureAnalyzer 失敗分析器就在注冊列表里面。

再來看下 PortInUseFailureAnalyzer 的源碼:

/** * A {@code FailureAnalyzer} that performs analysis of failures caused by a * {@code PortInUseException}. * * @author Andy Wilkinson */class PortInUseFailureAnalyzer extends AbstractFailureAnalyzer<PortInUseException> { @Override protected FailureAnalysis analyze(Throwable rootFailure, PortInUseException cause) { return new FailureAnalysis('Web server failed to start. Port ' + cause.getPort() + ' was already in use.', 'Identify and stop the process that’s listening on port ' + cause.getPort() + ' or configure this ' + 'application to listen on another port.', cause); }}

只要應(yīng)用啟動過程上拋出了 PortInUseException 異常就會被這個(gè)失敗分析器攔截并輸出可讀性的錯(cuò)誤信息,現(xiàn)在知道綁定重復(fù)綁定錯(cuò)誤是怎么輸出的了。

自定義 Failure Analyzers

從內(nèi)置的失敗分析器中可以發(fā)現(xiàn),所有的分析器都繼承了這個(gè)抽象基類是:AbstractFailureAnalyzer,它實(shí)現(xiàn)了 FailureAnalyzer 接口,一般基于這個(gè)抽象基類就可以實(shí)現(xiàn)自定義失敗分析器的擴(kuò)展。

下面棧長通過兩個(gè)示例帶大家了解下,如何擴(kuò)展或者自定義一個(gè) FailureAnalyzer。

1、重寫端口失敗分析器

比如說上面的PortInUseFailureAnalyzer 輸出內(nèi)容是英文的,不是很直觀的看出,我們可以自己實(shí)現(xiàn)一個(gè)中文的端口失敗分析器。

很簡單,創(chuàng)建一個(gè)失敗分析器繼承 AbstractFailureAnalyzer 抽象類即可:

package cn.javastack.springboot.features.analyzer;import org.springframework.boot.diagnostics.AbstractFailureAnalyzer;import org.springframework.boot.diagnostics.FailureAnalysis;import org.springframework.boot.web.server.PortInUseException;public class PortInUseFailureAnalyzer extends AbstractFailureAnalyzer<PortInUseException> { @Override protected FailureAnalysis analyze(Throwable rootFailure, PortInUseException cause) { return new FailureAnalysis('你啟動的端口 ' + cause.getPort() + ' 被占用了.', '快檢查下端口 ' + cause.getPort() + ' 被哪個(gè)程序占用了,或者強(qiáng)制殺掉進(jìn)程.', cause); }}

重寫 analyze 方法,并返回一個(gè) FailureAnalysis 對象,F(xiàn)ailureAnalysis 類的三個(gè)主要信息分別是:

public FailureAnalysis(String description, String action, Throwable cause) { this.description = description; this.action = action; this.cause = cause;}

即要展示的:可讀性的錯(cuò)誤描述、建議的檢查修復(fù)動作、原始異常。

然后在自己的資源目錄下創(chuàng)建 META-INF/spring.factories 文件,內(nèi)容添加:

org.springframework.boot.diagnostics.FailureAnalyzer=cn.javastack.springboot.features.analyzer.PortInUseFailureAnalyzer

啟動輸出:

***************************APPLICATION FAILED TO START***************************Description:你啟動的端口 8080 被占用了.Action:快檢查下端口 8080 被哪個(gè)程序占用了,或者強(qiáng)制殺掉進(jìn)程.

這樣重新實(shí)現(xiàn)一下是不是要清楚多了?實(shí)習(xí)生都能看懂!

2、自定義失敗分析器

下面再來自定義一個(gè)全新的失敗分析器,讓大家能更清楚的認(rèn)識失敗分析器。

我們在創(chuàng)建 Bean 的過程中手動拋出一個(gè)自定義的異常:

@Beanpublic CommandLineRunner commandLineRunner(){ throw new JavastackException('Java技術(shù)棧異常');}

添加一個(gè)失敗分析器攔截該異常:

package cn.javastack.springboot.features.analyzer;import org.springframework.boot.diagnostics.AbstractFailureAnalyzer;import org.springframework.boot.diagnostics.FailureAnalysis;public class JavastackFailureAnalyzer extends AbstractFailureAnalyzer<JavastackException> { @Override protected FailureAnalysis analyze(Throwable rootFailure, JavastackException cause) { return new FailureAnalysis('Java技術(shù)棧發(fā)生異常了……', '趕快去檢查一下吧!', cause); }}

添加注冊:

org.springframework.boot.diagnostics.FailureAnalyzer=cn.javastack.springboot.features.analyzer.PortInUseFailureAnalyzer,cn.javastack.springboot.features.analyzer.JavastackFailureAnalyzer

啟動輸出:

***************************APPLICATION FAILED TO START***************************Description:Java技術(shù)棧發(fā)生異常了……Action:趕快去檢查一下吧!

如果不注冊該失敗分析器,這個(gè)自定義的異常就不會被內(nèi)置的失敗分析器攔截,就會輸出大堆的異常信息,使用失敗分析器能很直觀的看出是什么錯(cuò)誤及怎么修復(fù)這個(gè)錯(cuò)誤。

總結(jié)

Spring Boot 提供的失敗分析器以友好的錯(cuò)誤信息和修復(fù)建議代替了大堆的錯(cuò)誤異常信息,可以幫助我們更直觀的定位應(yīng)用啟動故障,你學(xué)會了嗎?

本文的所有示例源代碼都已上傳到了 Github:

https://github.com/javastacks/spring-boot-best-practice

歡迎大家 Star 關(guān)注,后續(xù)會不斷更新。

以上就是Spring Boot 項(xiàng)目啟動失敗的解決方案的詳細(xì)內(nèi)容,更多關(guān)于Spring Boot 項(xiàng)目啟動失敗的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Spring
相關(guān)文章:
主站蜘蛛池模板: 遂宁市| 大新县| 乌鲁木齐县| 阜康市| 密云县| 延寿县| 隆子县| 沁源县| 南召县| 县级市| 阿拉善右旗| 满洲里市| 洛宁县| 浦城县| 聂拉木县| 太原市| 张家口市| 商城县| 新源县| 交城县| 客服| 襄城县| 吉木萨尔县| 商河县| 昆明市| 楚雄市| 伽师县| 嘉义市| 延安市| 旬阳县| 南皮县| 庄浪县| 丹东市| 和林格尔县| 监利县| 买车| 浦北县| 鹰潭市| 准格尔旗| 金川县| 驻马店市|