Erstellen Sie einen benutzerdefinierten FailureAnalyzer mit Spring Boot

Erstellen Sie einen benutzerdefinierten FailureAnalyzer mit Spring Boot

1. Überblick

AFailureAnalyzer im Spring Boot bietet eine Möglichkeit,intercept exceptions that occur during the startup of an application zu verursachen, wenn ein Anwendungsstart fehlschlägt.

DasFailureAnalyzer ersetzt die Stapelverfolgung der Ausnahme durch eine besser lesbare Nachricht, die durch einFailureAnalysis-Objekt dargestellt wird, das eine Beschreibung des Fehlers und eine vorgeschlagene Vorgehensweise enthält.

Der Start enthält eine Reihe von Analysatoren für allgemeine Startausnahmen wiePortInUseException,NoUniqueBeanDefinitionException undUnsatisfiedDependencyException. These can be found in the org.springframework.boot.diagnostics package.

In diesem kurzen Tutorial werden wir unshow we can add our own custom FailureAnalyzer der vorhandenen ansehen.

2. Erstellen eines benutzerdefiniertenFailureAnalyzer

Um ein benutzerdefiniertesFailureAnalyzer zu erstellen, erweitern wir einfach die abstrakte KlasseAbstractFailureAnalyzer, die einen angegebenen Ausnahmetyp abfängt und dieanalyze()-API implementiert.

Das Framework bietet eineBeanNotOfRequiredTypeFailureAnalyzer-Implementierung, die die AusnahmeBeanNotOfRequiredTypeException nur behandelt, wenn die injizierte Bean einer dynamischen Proxy-Klasse angehört.

Erstellen wir ein benutzerdefiniertesFailureAnalyzer, das alle Ausnahmen vom TypBeanNotOfRequiredTypeException.behandelt. Unsere Klasse fängt die Ausnahme ab und erstellt einFailureAnalysis-Objekt mit hilfreichen Beschreibungen und Aktionsnachrichten:

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. Registrieren der benutzerdefiniertenFailureAnalyzer

Damit die benutzerdefiniertenFailureAnalyzer von Spring Boot berücksichtigt werden, muss sie in einer Standarddateiresources/META-INF/spring.factories registriert werden, die den Schlüsselorg.springframework.boot.diagnostics.FailureAnalyzer mit dem Wert des vollständigen Namens unserer Klasse enthält:

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

4. BenutzerdefinierteFailureAnalyzer in Aktion

Lassen Sie uns ein sehr einfaches Beispiel erstellen, in dem wir versuchen, eine Bean eines falschen Typs zu injizieren, um zu sehen, wie sich unsere benutzerdefiniertenFailureAnalyzerverhalten.

Erstellen wir zwei KlassenMyDAO undMySecondDAO und kommentieren Sie die zweite Klasse als Bean mit dem NamenmyDAO:

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

Als nächstes werden wir in einerMyService-Klasse versuchen, diemyDAO-Bean vom TypMySecondDAO in eine Variable vom TypMyDAO zu injizieren:

@Service
public class MyService {

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

Beim Ausführen der Spring Boot-Anwendung schlägt der Start mit der folgenden Konsolenausgabe fehl:

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

In diesem kurzen Tutorial haben wir uns darauf konzentriert, wie Sie einen benutzerdefinierten Spring BootFailureAnalyzerimplementieren.

Wie immer kann der vollständige Quellcode des Beispielsover on GitHub gefunden werden.