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 .