Создайте пользовательский FailureAnalyzer с Spring Boot

Создайте пользовательский FailureAnalyzer с Spring Boot

1. обзор

FailureAnalyzer в Spring Boot предлагает способintercept exceptions that occur during the startup of an application вызвать сбой при запуске приложения.

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

Boot содержит серию анализаторов для общих исключений запуска, таких какPortInUseException,NoUniqueBeanDefinitionException иUnsatisfiedDependencyException. These can be found in the org.springframework.boot.diagnostics package.

В этом кратком руководстве мы рассмотримhow we can add our own custom FailureAnalyzer среди существующих.

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

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

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

Давайте создадим собственныйFailureAnalyzer, который обрабатывает все исключения типаBeanNotOfRequiredTypeException.. Наш класс перехватывает исключение и создает объектFailureAnalysis с полезным описанием и сообщениями о действиях:

public class MyBeanNotOfRequiredTypeFailureAnalyzer
  extends AbstractFailureAnalyzer {

    @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, необходимо зарегистрировать его в стандартном файлеresources/META-INF/spring.factories, который содержит ключorg.springframework.boot.diagnostics.FailureAnalyzer со значением полного имени нашего класса:

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

4. ПользовательскийFailureAnalyzer в действии

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

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

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

Затем в классеMyService мы попытаемся внедрить bean-компонентmyDAO, имеющий типMySecondDAO, в переменную типа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.example.failureanalyzer.MyDAO
  because it is of type com.example.failureanalyzer.MySecondDAO$$EnhancerBySpringCGLIB$$d902559e

Action:

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

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

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

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