«1. Обзор

FailureAnalyzer в Spring Boot предлагает способ перехвата исключений, возникающих во время запуска приложения, вызывающих сбой при запуске приложения.

FailureAnalyzer заменяет трассировку стека исключения более удобочитаемым сообщением, представленным объектом FailureAnalysis, который содержит описание ошибки и предлагаемый курс действий.

Boot содержит ряд анализаторов распространенных исключений запуска, таких как PortInUseException, NoUniqueBeanDefinitionException и UnsatisfiedDependencyException. Их можно найти в пакете org.springframework.boot.diagnostics.

В этом кратком руководстве мы рассмотрим, как мы можем добавить свой собственный FailureAnalyzer к существующим.

2. Создание пользовательского FailureAnalyzer

Чтобы создать собственный FailureAnalyzer, мы просто расширим абстрактный класс AbstractFailureAnalyzer, который перехватывает указанный тип исключения и реализует API анализа().

Платформа предоставляет реализацию BeanNotOfRequiredTypeFailureAnalyzer, которая обрабатывает исключение BeanNotOfRequiredTypeException, только если внедряемый компонент относится к классу динамического прокси.

Давайте создадим собственный FailureAnalyzer, который обрабатывает все исключения типа BeanNotOfRequiredTypeException. Наш класс перехватывает исключение и создает объект FailureAnalysis с полезным описанием и сообщениями о действиях. стандартный файл resources/META-INF/spring.factories, содержащий ключ org.springframework.boot.diagnostics.FailureAnalyzer со значением полного имени нашего класса:

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

4. Custom FailureAnalyzer в действии ~~ ~ Давайте создадим очень простой пример, в котором мы пытаемся внедрить bean-компонент неправильного типа, чтобы увидеть, как ведет себя наш собственный FailureAnalyzer.

Давайте создадим два класса MyDAO и MySecondDAO и аннотируем второй класс как bean-компонент с именем myDAO:

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

Далее, в классе MyService мы попытаемся внедрить bean-компонент myDAO, который имеет тип MySecondDAO в переменную типа MyDAO:

После запуска приложения Spring Boot произойдет сбой запуска со следующим выводом консоли:

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

5. Заключение

@Service
public class MyService {

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

В этом кратком руководстве мы сосредоточились на том, как реализовать собственный Spring Boot FailureAnalyzer.

***************************
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

Как всегда, полный исходный код примера можно найти на GitHub.

«

As always, the full source code of the example can be found over on GitHub.