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

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

 更新時(shí)間:2021年03月02日 15:44:44   作者:Java技術(shù)棧  
這篇文章主要介紹了Spring Boot 項(xiàng)目啟動(dòng)失敗的解決方案,幫助大家更好的理解和學(xué)習(xí)使用Spring Boot,感興趣的朋友可以了解下

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

***************************
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ò)誤信息輸出的呢?今天棧長(zhǎng)分享一個(gè) Spring Boot 啟動(dòng)失敗的簡(jiǎn)單易懂的玩法,讓新來(lái)的實(shí)習(xí)生 1 秒都能看出問(wèn)題。

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

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

Failure Analyzers 介紹

Spring Boot 中注冊(cè)了許多 "Failure Analyzers",即 "失敗分析器",Spring Boot 中的啟動(dòng)失敗的場(chǎng)景都是由這些失敗分析器攔截處理的。

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);

}

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

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

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

注冊(cè)的所有失敗分析器列表:

# 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

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

再來(lái)看下 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)用啟動(dòng)過(guò)程上拋出了 PortInUseException 異常就會(huì)被這個(gè)失敗分析器攔截并輸出可讀性的錯(cuò)誤信息,現(xiàn)在知道綁定重復(fù)綁定錯(cuò)誤是怎么輸出的了。

自定義 Failure Analyzers

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

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

1、重寫(xiě)端口失敗分析器

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

很簡(jiǎn)單,創(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("你啟動(dòng)的端口 " + cause.getPort() + " 被占用了.",
   "快檢查下端口 " + cause.getPort() + " 被哪個(gè)程序占用了,或者強(qiáng)制殺掉進(jìn)程.",
   cause);
 }

}

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

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

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

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

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

啟動(dòng)輸出:

***************************
APPLICATION FAILED TO START
***************************

Description:

你啟動(dòng)的端口 8080 被占用了.

Action:

快檢查下端口 8080 被哪個(gè)程序占用了,或者強(qiáng)制殺掉進(jìn)程.

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

2、自定義失敗分析器

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

我們?cè)趧?chuàng)建 Bean 的過(guò)程中手動(dòng)拋出一個(gè)自定義的異常:

@Bean
public 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);
 }

}

添加注冊(cè):

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

啟動(dòng)輸出:

***************************
APPLICATION FAILED TO START
***************************

Description:

Java技術(shù)棧發(fā)生異常了……

Action:

趕快去檢查一下吧!

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

總結(jié)

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

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

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

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

以上就是Spring Boot 項(xiàng)目啟動(dòng)失敗的解決方案的詳細(xì)內(nèi)容,更多關(guān)于Spring Boot 項(xiàng)目啟動(dòng)失敗的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Netty結(jié)合Protobuf進(jìn)行編解碼的方法

    Netty結(jié)合Protobuf進(jìn)行編解碼的方法

    這篇文章主要介紹了Netty結(jié)合Protobuf進(jìn)行編解碼,通過(guò)文檔表述和代碼實(shí)例充分說(shuō)明了如何進(jìn)行使用和操作,需要的朋友可以參考下
    2021-06-06
  • SpringBoot配置Clickhouse的示例代碼

    SpringBoot配置Clickhouse的示例代碼

    這篇文章主要介紹了SpringBoot配置Clickhouse的示例代碼,代碼簡(jiǎn)單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考價(jià)值,需要的朋友可以參考下
    2022-02-02
  • SpringBoot淺析安全管理之Spring Security配置

    SpringBoot淺析安全管理之Spring Security配置

    安全管理是軟件系統(tǒng)必不可少的的功能。根據(jù)經(jīng)典的“墨菲定律”——凡是可能,總會(huì)發(fā)生。如果系統(tǒng)存在安全隱患,最終必然會(huì)出現(xiàn)問(wèn)題,這篇文章主要介紹了SpringBoot安全管理Spring Security基本配置
    2022-08-08
  • springboot連接不上redis的三種解決辦法

    springboot連接不上redis的三種解決辦法

    這篇文章主要介紹了springboot連接不上redis的三種解決辦法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • 如何完成spring的最小化XML配置

    如何完成spring的最小化XML配置

    這篇文章主要介紹了如何完成spring的最小化XML配置,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,,需要的朋友可以參考下
    2019-06-06
  • Java?Date(日期)對(duì)象進(jìn)行格式化的思路詳解

    Java?Date(日期)對(duì)象進(jìn)行格式化的思路詳解

    Date類是經(jīng)常會(huì)使用到的一個(gè)用來(lái)處理日期、時(shí)間的一個(gè)類。Date類是在java.util包下的Date類,這篇文章主要介紹了Java?Date(日期)對(duì)象如何進(jìn)行格式化呢,需要的朋友可以參考下
    2022-09-09
  • Java IO流深入理解

    Java IO流深入理解

    這篇文章主要介紹了java IO流的深入理解,下面和小編來(lái)一起學(xué)習(xí)一下吧,希望能給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容
    2021-07-07
  • Java語(yǔ)言字典序排序算法解析及代碼示例

    Java語(yǔ)言字典序排序算法解析及代碼示例

    這篇文章主要介紹了Java語(yǔ)言字典序排序算法解析及代碼示例,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01
  • Java橋接模式實(shí)例詳解【簡(jiǎn)單版與升級(jí)版】

    Java橋接模式實(shí)例詳解【簡(jiǎn)單版與升級(jí)版】

    這篇文章主要介紹了Java橋接模式,結(jié)合實(shí)例形式分析了java橋接模式簡(jiǎn)單版與升級(jí)版兩種實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2019-07-07
  • Java中常用時(shí)間的一些相關(guān)方法

    Java中常用時(shí)間的一些相關(guān)方法

    日期的使用多種多樣,但萬(wàn)變不離其宗,下面這篇文章主要給大家介紹了關(guān)于Java中常用時(shí)間的一些相關(guān)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2021-10-10

最新評(píng)論

准格尔旗| 板桥市| 前郭尔| 手游| 儋州市| 义马市| 葫芦岛市| 和硕县| 延寿县| 邮箱| 雷州市| 高唐县| 保康县| 福州市| 晋中市| 西畴县| 新泰市| 房山区| 溧水县| 石城县| 龙江县| 安顺市| 宣威市| 阜阳市| 新宁县| 永德县| 伊金霍洛旗| 襄樊市| 隆安县| 五寨县| 嫩江县| 海安县| 宜兴市| 浙江省| 长沙县| 焦作市| 博乐市| 类乌齐县| 扶沟县| 元谋县| 班玛县|