Spring Bootはいつも起動に失敗して、今度はもう怖くない!

9025 ワード

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学習倉庫をお勧めします.スターの注目を歓迎します.
https://github.com/javastacks...
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
 */
@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 {

   @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異常が投げ出されると、この失敗したアナライザによって可読性のエラー情報がブロックされ、出力され、バインド重複バインドエラーがどのように出力されるかがわかります.
カスタムFailure Analyzers
内蔵された失敗したアナライザから、すべてのアナライザがこの抽象ベースクラスを継承していることがわかります.AbstractFailureAnalylyzerは、FailureAnalylyzerインタフェースを実現し、一般的にこの抽象ベースクラスに基づいてカスタム失敗したアナライザの拡張を実現することができます.
次のスタック長は、2つの例でFailureAnalylyzerを拡張またはカスタマイズする方法について説明します.
1.ポート書き換え失敗分析器
例えば、上記のPortInUseFailureAnalyzerの出力内容は英語で、直感的には見えませんが、私たちは自分で中国語のポート失敗分析器を実現することができます.
簡単です.AbstractFailureAnalyzer抽象クラスを継承する失敗したアナライザを作成します.
/**
 *        :Java   
 */
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 {

   @Override
   protected FailureAnalysis analyze(Throwable rootFailure, PortInUseException cause) {
      return new FailureAnalysis("       " + cause.getPort() + "     .",
            "       " + cause.getPort() + "         ,        .",
            cause);
   }

}
analyzeメソッドを書き換え、FailureAnalysisオブジェクトを返します.FailureAnalysisクラスの3つの主要な情報は、次のとおりです.
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         ,        .

このように再実現するには、ずっとはっきりしているのではないでしょうか.実習生はみな理解できる!
2、カスタム失敗分析器
次に、新しい失敗アナライザをカスタマイズして、失敗アナライザをより明確に認識できます.
Beanの作成中にカスタム例外を手動で放出します.
/**
 *        :Java   
 */
@Bean
public CommandLineRunner commandLineRunner(){
    throw new JavastackException("Java     ");
}

失敗したアナライザを追加して例外をブロックします.
/**
 *        :Java   
 */
package cn.javastack.springboot.features.analyzer;

import org.springframework.boot.diagnostics.AbstractFailureAnalyzer;
import org.springframework.boot.diagnostics.FailureAnalysis;

public class JavastackFailureAnalyzer extends AbstractFailureAnalyzer {

   @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が提供する失敗分析器は、多くのエラー異常情報の代わりに友好的なエラー情報と修復提案を提供しています.アプリケーションの起動障害をより直感的に位置決めするのに役立ちます.覚えましたか.
本明細書のソースコードの例はすべてGithubにアップロードされています.
https://github.com/javastacks...
皆さんの注目を歓迎します.後続は絶えず更新されます.
Spring Bootチュートリアルをもっと勉強して、公式番号Java技術スタックに注目してください.バックグラウンドで返事します:boot、歴史Spring Bootチュートリアルは全部整理しました.
最后に、见たり、転送したりすることを忘れないでください.励ましが必要です.
著作権申明:本文は公衆番号「Java技術スタック」のオリジナルで、オリジナルは本当に容易ではありません.転載、引用本文の内容は出典を明記してください.剽窃、洗稿を禁止してください.自重してください.他人の労働成果と知的財産権を尊重してください.
最近のホット文書の推奨:
1. 600+道Java面接問題及び解答整理(2021最新版)
2. やっとオープンソースプロジェクトでIntelliJ IDEAアクティブコードを手に入れました。いい香りですね。
3. アリMockツールは正式にオープンし、市販のすべてのMockツールを乾かします!
4. Spring Cloud 2020.0.0が正式にリリースされ、新しい転覆バージョン!
5. 『Java開発マニュアル(嵩山版)』最新リリース、速速速ダウンロード!
いいと思います.いいね+転送を忘れないでください.