Fehler bei Spring-Kontextsuche fehlgeschlagen
In diesem Beitrag werde ich zeigen, wie der Fehler behoben wird, dass die Spring-Kontextsuche fehlgeschlagen ist. Dieses Szenario ähnelt der Verwendung von Spring Boot 2.x oder Spring Boot 1.5. Ich habe kürzlich Spring Boot 2.x verwendet und bin auf einen Fehler wie den folgenden gestoßen:
org.glassfish.jersey.server.spring.SpringComponentProvider: Spring context lookup failed, skipping spring component provider initialization.
Warum habe ich diesen Fehler gesehen?
Bevor ich erklären kann, warum ich diesen Fehler gesehen habe. Lassen Sie uns ein paar grundlegende Konzepte darüber erläutern, was ContextLoaderListner
ist ist und was DispatcherServlet
ist.
Spring Boot erstellt mehrere Kontexte. Es beginnt mit einem Stammkontext und die restlichen Kontexte sind Kindkontexte. Untergeordnete Kontexte können auf die im Stammkontext definierten Beans zugreifen, aber nicht umgekehrt .
ContextLoaderListener
Wenn Sie die Spring Boot-Anwendung starten, erstellt ContextLoaderListener den Stammanwendungskontext. Spring Boot teilt diesen Stammkontext mit allen anderen untergeordneten Kontexten, die DispatcherServlet
sind wird erschaffen. Normalerweise definieren Sie ContextLoaderListener
in web.xml wie unten:
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/applicationContext.xml</param-value>
</context-param>
ServletContext
speichert diesen Stammanwendungskontext und man kann WebApplicationContextUtils
verwenden um diesen Kontext abzurufen.
DispatcherServlet
DispatcherServlet
ist ein HttpServlet
dessen Hauptzweck darin besteht, eingehende Webanforderungen zu verarbeiten, die dem konfigurierten URL-Muster entsprechen. Wenn Sie DispatcherServlet
definieren In der Spring-Konfiguration verwendet Spring eine konfigurierte Konfigurationsdatei oder erstellt seine eigene Konfigurationsdatei basierend auf Controllern und Ansichten im Code.
DispatcherServlet
erstellt einen untergeordneten Anwendungskontext pro Servlet-Eintrag.
Warum Spring Context Lookup fehlgeschlagen ist:
Spring Boot 2.x bietet eine programmgesteuerte Möglichkeit, Ihre Kontexte und Servlets zu konfigurieren. In meinem speziellen Fall habe ich diese programmatische Methode verwendet. Aber ich hatte trotzdem konfiguriert, den Anwendungskontext zu laden, insbesondere den Root-Anwendungskontext.
Um diesen Stammanwendungskontext zu konfigurieren, benötigte ich ContextLoaderListener
. Da ich web.xml
nicht verwenden wollte , suchte ich nach einem programmatischen Weg. Spring Boot 2.x bietet dies über SpringBootServletInitializer
an . Grundsätzlich, wenn wir die Stammanwendungsklasse mit SpringBootServletInitializer
erweitern , bindet es Servlet-, Filter- und ServletInitializer-Beans aus dem Anwendungskontext an den Server. Dadurch können wir auch ein WAR-Archiv unserer Anwendung erstellen und in jedem Webcontainer ausführen.
Einmal habe ich SpringBootServletInitializer
hinzugefügt In meiner Spring Boot-Hauptanwendungsklasse konnte ich diesen Fehler beheben. Der Code dafür sieht wie folgt aus:
@SpringBootApplication
public class Application extends SpringBootServletInitializer
{
public static void main(String[] args)
{
SpringApplication sa = new SpringApplication(Application.class);
sa.run(args);
}
}
Schlussfolgerung
In diesem Beitrag haben wir gezeigt, wie wir den Fehler Spring Context Lookup Failed. beheben können Wenn Sie Feedback zu diesem Beitrag haben, kommentieren Sie es bitte und ich werde Ihnen gerne antworten.
Referenzen
- ContextLoaderListener vs. DispatcherServlet
- Spring Boot Servlet-Initialisierer
- Aktualisieren Sie Spring Boot und fügen Sie Spring Boot Actuator hinzu – Spring Boot Actuator