Criar um FailureAnalyzer personalizado com Spring Boot
1. Visão geral
UmFailureAnalyzer no Spring Boot oferece uma maneira deintercept exceptions that occur during the startup of an application causar uma falha na inicialização do aplicativo.
OFailureAnalyzer substitui o rastreamento de pilha da exceção por uma mensagem mais legível representada por um objetoFailureAnalysis que contém uma descrição do erro e um curso de ação sugerido.
O boot contém uma série de analisadores para exceções de inicialização comuns, comoPortInUseException,NoUniqueBeanDefinitionException eUnsatisfiedDependencyException. These can be found in the org.springframework.boot.diagnostics package.
Neste tutorial rápido, vamos dar uma olhada emhow we can add our own custom FailureAnalyzer para os existentes.
2. Criando umFailureAnalyzer personalizado
Para criar umFailureAnalyzer personalizado, vamos simplesmente estender a classe abstrataAbstractFailureAnalyzer - que intercepta um tipo de exceção especificado e implementa a APIanalyze().
A estrutura fornece uma implementaçãoBeanNotOfRequiredTypeFailureAnalyzer que lida com a exceçãoBeanNotOfRequiredTypeException apenas se o bean injetado for de uma classe proxy dinâmica.
Vamos criar umFailureAnalyzer personalizado que lida com todas as exceções do tipoBeanNotOfRequiredTypeException. Nossa classe intercepta a exceção e cria um objetoFailureAnalysis com descrição útil e mensagens de ação:
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. Registrando oFailureAnalyzer personalizado
Para oFailureAnalyzer personalizado a ser considerado pelo Spring Boot, é obrigatório registrá-lo em um arquivoresources/META-INF/spring.factories padrão que contém a chaveorg.springframework.boot.diagnostics.FailureAnalyzer com um valor do nome completo de nossa classe:
org.springframework.boot.diagnostics.FailureAnalyzer=\
com.example.failureanalyzer.MyBeanNotOfRequiredTypeFailureAnalyzer
4. FailureAnalyzer personalizado em ação
Vamos criar um exemplo muito simples no qual tentamos injetar um bean de um tipo incorreto para ver como nossoFailureAnalyzer personalizado se comporta.
Vamos criar duas classesMyDAOeMySecondDAOe anotar a segunda classe como um bean chamadomyDAO:
public class MyDAO { }
@Repository("myDAO")
public class MySecondDAO { }
A seguir, em uma classeMyService, tentaremos injetar o beanmyDAO, que é do tipoMySecondDAO, em uma variável do tipoMyDAO:
@Service
public class MyService {
@Resource(name = "myDAO")
private MyDAO myDAO;
}
Ao executar o aplicativo Spring Boot, a inicialização falhará com a seguinte saída do console:
***************************
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. Conclusão
Neste tutorial rápido, nos concentramos em como implementar um Spring BootFailureAnalyzer personalizado.
Como sempre, o código-fonte completo do exemplo pode ser encontradoover on GitHub.