Перейти к основному содержимому

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

· 3 мин. чтения

1. Обзор

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

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

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

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

2. Создание собственного анализатора отказов

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

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

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

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

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

Давайте создадим очень простой пример, в котором мы пытаемся внедрить 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.foreach.failureanalyzer.MyDAO
because it is of type com.foreach.failureanalyzer.MySecondDAO$$EnhancerBySpringCGLIB$$d902559e

Action:

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

5. Вывод

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

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