Spring BootでカスタムFailureAnalyzerを作成する

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]にあります。