您好,登錄后才能下訂單哦!
啟動Spring Boot 項目失敗如何解決?針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
Spring Boot 項目是不是經常失敗,顯示一大堆的錯誤信息,如端口重復綁定時會打印以下異常:
*************************** 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.
這個大家應該很熟悉了吧!
錯誤信息大家都能看懂,但很不友好,那么,Spring Boot 是怎么實現這樣一個異常錯誤信息輸出的呢?今天棧長分享一個 Spring Boot 啟動失敗的簡單易懂的玩法,讓新來的實習生 1 秒都能看出問題。
如果你對 Spring Boot 還不是很熟悉,或者只是會簡單的使用,那還是建議你深入學習下吧,推薦這個 Spring Boot 學習倉庫,歡迎 Star 關注:
https://github.com/javastacks/spring-boot-best-practice
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 */ @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); }
這個接口的目的就是: 分析啟動失敗異常并顯示給用戶有用的診斷信息。
Spring Boot 內置注冊的所有失敗分析器在這個文件里面:
/org/springframework/boot/spring-boot/2.3.5.RELEASE/spring-boot-2.3.5.RELEASE-sources.jar!/META-INF/spring.factories
注冊的所有失敗分析器列表:
# Failure Analyzers org.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
再回到上面的端口重復綁定啟動失敗異常,就是注冊了 PortInUseFailureAnalyzer
這個失敗分析器,可以看到 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); } }
只要應用啟動過程上拋出了 PortInUseException
異常就會被這個失敗分析器攔截并輸出可讀性的錯誤信息,現在知道綁定重復綁定錯誤是怎么輸出的了。
從內置的失敗分析器中可以發現,所有的分析器都繼承了這個抽象基類是:AbstractFailureAnalyzer,它實現了 FailureAnalyzer 接口,一般基于這個抽象基類就可以實現自定義失敗分析器的擴展。
下面棧長通過兩個示例帶大家了解下,如何擴展或者自定義一個 FailureAnalyzer。
比如說上面的PortInUseFailureAnalyzer
輸出內容是英文的,不是很直觀的看出,我們可以自己實現一個中文的端口失敗分析器。
很簡單,創建一個失敗分析器繼承 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() + " 被哪個程序占用了,或者強制殺掉進程.", cause); } }
重寫 analyze
方法,并返回一個 FailureAnalysis
對象,FailureAnalysis
類的三個主要信息分別是:
public FailureAnalysis(String description, String action, Throwable cause) { this.description = description; this.action = action; this.cause = cause; }
即要展示的:可讀性的錯誤描述、建議的檢查修復動作、原始異常。
然后在自己的資源目錄下創建 META-INF/spring.factories 文件,內容添加:
org.springframework.boot.diagnostics.FailureAnalyzer=\ cn.javastack.springboot.features.analyzer.PortInUseFailureAnalyzer
啟動輸出:
*************************** APPLICATION FAILED TO START *************************** Description: 你啟動的端口 8080 被占用了. Action: 快檢查下端口 8080 被哪個程序占用了,或者強制殺掉進程.
這樣重新實現一下是不是要清楚多了?實習生都能看懂!
下面再來自定義一個全新的失敗分析器,讓大家能更清楚的認識失敗分析器。
我們在創建 Bean 的過程中手動拋出一個自定義的異常:
@Bean public CommandLineRunner commandLineRunner(){ throw new JavastackException("Java技術棧異常"); }
添加一個失敗分析器攔截該異常:
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技術棧發生異常了……", "趕快去檢查一下吧!", cause); } }
添加注冊:
org.springframework.boot.diagnostics.FailureAnalyzer=\ cn.javastack.springboot.features.analyzer.PortInUseFailureAnalyzer,\ cn.javastack.springboot.features.analyzer.JavastackFailureAnalyzer
啟動輸出:
*************************** APPLICATION FAILED TO START *************************** Description: Java技術棧發生異常了…… Action: 趕快去檢查一下吧!
如果不注冊該失敗分析器,這個自定義的異常就不會被內置的失敗分析器攔截,就會輸出大堆的異常信息,使用失敗分析器能很直觀的看出是什么錯誤及怎么修復這個錯誤。
關于啟動Spring Boot 項目失敗如何解決問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。