Créer un FailureAnalyzer personnalisé avec un démarrage à ressort

Créer un FailureAnalyzer personnalisé avec Spring Boot

1. Vue d'ensemble

UnFailureAnalyzer dans Spring Boot offre un moyen deintercept exceptions that occur during the startup of an application provoquant un échec de démarrage de l'application.

LeFailureAnalyzer remplace la trace de pile de l'exception par un message plus lisible représenté par un objetFailureAnalysis qui contient une description de l'erreur et un plan d'action suggéré.

Boot contient une série d'analyseurs pour les exceptions de démarrage courantes telles quePortInUseException,NoUniqueBeanDefinitionException etUnsatisfiedDependencyException. These can be found in the org.springframework.boot.diagnostics package.

Dans ce rapide tutoriel, nous allons jeter un oeil àhow we can add our own custom FailureAnalyzer par rapport à ceux existants.

2. Création d'unFailureAnalyzer personnalisé

Pour créer unFailureAnalyzer personnalisé, nous allons simplement étendre la classe abstraiteAbstractFailureAnalyzer - qui intercepte un type d'exception spécifié et implémente l'APIanalyze().

Le framework fournit une implémentation deBeanNotOfRequiredTypeFailureAnalyzer qui traite l'exceptionBeanNotOfRequiredTypeException uniquement si le bean injecté est d'une classe proxy dynamique.

Créons unFailureAnalyzer personnalisé qui traite toutes les exceptions de typeBeanNotOfRequiredTypeException.. Notre classe intercepte l'exception et crée un objetFailureAnalysis avec une description et des messages d'action utiles:

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. Enregistrement desFailureAnalyzer personnalisés

Pour que lesFailureAnalyzer personnalisés soient pris en compte par Spring Boot, il est obligatoire de les enregistrer dans un fichierresources/META-INF/spring.factories standard qui contient la cléorg.springframework.boot.diagnostics.FailureAnalyzer avec une valeur du nom complet de notre classe:

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

4. FailureAnalyzer personnalisés en action

Créons un exemple très simple dans lequel nous essayons d'injecter un bean d'un type incorrect pour voir comment nosFailureAnalyzer personnalisés se comportent.

Créons deux classesMyDAO etMySecondDAO et annotons la deuxième classe comme un bean appelémyDAO:

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

Ensuite, dans une classeMyService, nous tenterons d'injecter le beanmyDAO, qui est de typeMySecondDAO, dans une variable de typeMyDAO:

@Service
public class MyService {

    @Resource(name = "myDAO")
    private MyDAO myDAO;
}

Lors de l'exécution de l'application Spring Boot, le démarrage échouera avec la sortie de console suivante:

***************************
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. Conclusion

Dans ce rapide didacticiel, nous nous sommes concentrés sur la mise en œuvre d'un Spring BootFailureAnalyzer personnalisé.

Comme toujours, le code source complet de l'exemple peut être trouvéover on GitHub.