1. Обзор
Анализатор сбоев в Spring Boot предлагает способ перехвата исключений, возникающих во время запуска приложения , вызывающих сбой запуска приложения.
Анализатор Failure Analyzer заменяет трассировку стека исключения более читаемым сообщением, представленным объектом FailureAnalysis , который содержит описание ошибки и предлагаемый курс действий.
Boot содержит ряд анализаторов для распространенных исключений запуска, таких как PortInUseException , NoUniqueBeanDefinitionException и UnsatisfiedDependencyException . Их можно найти в пакете org.springframework.boot.diagnostics .
В этом кратком руководстве мы рассмотрим , как мы можем добавить свой собственный Анализатор сбоев к существующим.
2. Создание пользовательского анализатора сбоев
Чтобы создать пользовательский FailureAnalyzer , мы просто расширим абстрактный класс AbstractFailureAnalyzer – который перехватывает указанный тип исключения и реализует analyze() API.
Фреймворк предоставляет реализацию Bean Not Of Required Type Failure Analyzer , которая имеет дело с исключением BeanNotOfRequiredTypeException только в том случае, если вводимый компонент относится к динамическому прокси-классу.
Давайте создадим пользовательский Анализатор сбоев , который обрабатывает все исключения типа BeanNotOfRequiredTypeException. Наш класс перехватывает исключение и создает Анализ сбоев объект с полезным описанием и сообщениями о действиях:
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 рассматривался Spring Boot, необходимо зарегистрировать его в стандартном resources/META-INF/spring.factories файле, содержащем org.springframework.boot.diagnostics.FailureAnalyzer ключ со значением полного имени нашего класса:
org.springframework.boot.diagnostics.FailureAnalyzer=\ com.baeldung.failureanalyzer.MyBeanNotOfRequiredTypeFailureAnalyzer
4. Пользовательский анализатор сбоев в действии
Давайте создадим очень простой пример, в котором мы попытаемся ввести компонент неправильного типа, чтобы увидеть, как ведет себя наш пользовательский FailureAnalyzer .
Давайте создадим два класса My DAO и My Second DAY и аннотируем второй класс как боб под названием MyDao :
public class MyDAO { }
@Repository("myDAO") public class MySecondDAO { }
Затем в классе MyService мы попытаемся ввести компонент MyDao , который имеет тип Мой второй ДЕНЬ , в переменную типа 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 .
Как всегда, полный исходный код примера можно найти на GitHub .