1概要

Spring Bootの

FailureAnalyzer

は、アプリケーションの起動中に発生した例外を捕捉してアプリケーションの起動失敗を引き起こす方法を提供します。


FailureAnalyzer

は、例外のスタックトレースを、エラーの説明と推奨される対処方法を含む

FailureAnalysis

オブジェクトで表される、より読みやすいメッセージで置き換えます。

Bootには、

PortInUseException



NoUniqueBeanDefinitionException

このクイックチュートリアルでは、私たちが既存のカスタム

FailureAnalyzer

** をどのように追加できるかを見ていきます。


2カスタム

FailureAnalyzer


を作成する

カスタム

FailureAnalyzer

を作成するには、抽象クラス

AbstractFailureAnalyzer

を拡張するだけです。これは、指定された例外タイプをインターセプトし、

analyze()

APIを実装します。

フレームワークは、注入されるBeanが動的プロキシクラスのものである場合に限り、例外

BeanNotOfRequiredTypeException

を処理する

BeanNotOfRequiredTypeFailureAnalyzer

実装を提供します。


BeanNotOfRequiredTypeException型のすべての例外を処理するカスタム

FailureAnalyzer

を作成しましょう。私たちのクラスは例外をインターセプトし、役に立つ説明とアクションメッセージを含む

FailureAnalysis__オブジェクトを作成します。

public class MyBeanNotOfRequiredTypeFailureAnalyzer
  extends AbstractFailureAnalyzer<BeanNotOfRequiredTypeException> {

    @Override
    protected FailureAnalysis analyze(Throwable rootFailure,
      BeanNotOfRequiredTypeException cause) {
        return new FailureAnalysis(getDescription(cause), getAction(cause), cause);
    }

    private String getDescription(BeanNotOfRequiredTypeException ex) {
        return String.format("The bean %s could not be injected as %s "
          + "because it is of type %s",
          ex.getBeanName(),
          ex.getRequiredType().getName(),
          ex.getActualType().getName());
    }

    private String getAction(BeanNotOfRequiredTypeException ex) {
        return String.format("Consider creating a bean with name %s of type %s",
          ex.getBeanName(),
          ex.getRequiredType().getName());
    }
}


3カスタム

FailureAnalyzer


を登録する

カスタムの

FailureAnalyzer

をSpring Bootで考慮するには、フルネームの値を持つ

org.springframework.boot.diagnostics.FailureAnalyzer

キーを含む標準の

resources/META-INF/spring.factories

ファイルに登録することが必須です私たちのクラスの:

org.springframework.boot.diagnostics.FailureAnalyzer=\
  com.baeldung.failureanalyzer.MyBeanNotOfRequiredTypeFailureAnalyzer


4カスタム

FailureAnalyzer

in Action

私たちのカスタム

FailureAnalyzer

がどのように振る舞うかを見るために間違ったタイプのbeanをインジェクトしようとする非常に簡単な例を作成しましょう。

2つのクラス

MyDAO



MySecondDAO

を作成し、2番目のクラスに

myDAO

というBeanとしてアノテーションを付けます。

public class MyDAO { }

@Repository("myDAO")
public class MySecondDAO { }

次に、

MyService

クラスで、

MySecondDAO

型の

myDAO

Beanを

MyDAO

型の変数に挿入します。

@Service
public class MyService {

    @Resource(name = "myDAO")
    private MyDAO myDAO;
}

Spring Bootアプリケーションを実行すると、起動は次のコンソール出力で失敗します。

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

Description:

The bean myDAO could not be injected as com.baeldung.failureanalyzer.MyDAO
  because it is of type com.baeldung.failureanalyzer.MySecondDAO$$EnhancerBySpringCGLIB$$d902559e

Action:

Consider creating a bean with name myDAO of type com.baeldung.failureanalyzer.MyDAO


5結論

このクイックチュートリアルでは、カスタムのSpring Boot

FailureAnalyzer

の実装方法に焦点を当てました。

いつものように、この例の完全なソースコードはhttps://github.com/eugenp/tutorials/tree/master/spring-boot[over on GitHub]にあります。