Wie registriere ich die mit Anmerkungen versehene Spring @ Configuration-Klasse anstelle der Datei applicationContext.xml in web.xml?

68

Ich benutze jsf und spring zusammen in der Webanwendung. Ich habe die Datenquelle und die Sitzungsfactory in einer Konfigurationsklasse konfiguriert, die Anmerkungen wie @Configuration, @ComponentScanusw. verwendet. Ich habe keine applicationContext.xml-Datei in meinem Projekt, da ich jeden Eintrag von Kontext-XML in der Konfigurationsklasse verarbeite. Der Testfall funktioniert erfolgreich, aber wenn ich meine Webanwendung bereitstelle, wird ein Fehler angezeigt

java.lang.IllegalStateException: Kein WebApplicationContext gefunden: Kein ContextLoaderListener registriert?

Wenn ich nun eine Listener-Klasse in web.xml gebe,

<listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

es gibt mir Fehler,

/WEB-INF/applicationContext.xml nicht gefunden

Gemäß dem Dokument von ContextLoaderListenerist es wahr, dass, wenn ich contextConfigLocationparam nicht web.xmlexplizit eingebe , nach der Standard-Spring-Kontextdatei mit dem Namen applicationContext.xmlin gesucht wird web.xml. Was soll ich nun tun, wenn ich die Spring-Kontextdatei nicht verwenden und die gesamte Konfiguration mit Anmerkungen durchführen möchte? Wie sollte ich die Listener-Klasse registrieren ContextLoaderListener, damit ich meine Webanwendung ohne Verwendung einer XML-Datei und nur mit Anmerkungen mit spring und jsf ausführen kann?

Mital Pritmani
quelle

Antworten:

133

In müssen web.xmlSie den Kontext booten AnnotationConfigWebApplicationContext:

<servlet>
    <servlet-name>appServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextClass</param-name>
        <param-value>
            org.springframework.web.context.support.AnnotationConfigWebApplicationContext
        </param-value>
    </init-param>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            org.package.YouConfigurationAnnotatedClass
        </param-value>
    </init-param>
</servlet>

Und vergessen Sie nicht, diese zu verwenden, @EnableWebMvcdamit Ihre MVC-Anmerkungen aktiviert werden.

weiterführende Literatur:

BEARBEITEN als "Kommentare folgen" => um vollständig zu sein:

Ja natürlich brauchst du einen Zuhörer. Obwohl das oben Gesagte die Frage " So registrieren Sie die mit Anmerkungen versehene Spring @ Configuration-Klasse anstelle der Datei applicationContext.xml in web.xml " vollständig beantwortet , finden Sie hier ein Beispiel aus der offiziellen Spring-Dokumentation, in der die vollständigen Layouts aufgeführt sind web.xml:

<web-app>
  <!-- Configure ContextLoaderListener to use AnnotationConfigWebApplicationContext
       instead of the default XmlWebApplicationContext -->
  <context-param>
      <param-name>contextClass</param-name>
      <param-value>
          org.springframework.web.context.support.AnnotationConfigWebApplicationContext
      </param-value>
  </context-param>

  <!-- Configuration locations must consist of one or more comma- or space-delimited
       fully-qualified @Configuration classes. Fully-qualified packages may also be
       specified for component-scanning -->
  <context-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>com.acme.AppConfig</param-value>
  </context-param>

  <!-- Bootstrap the root application context as usual using ContextLoaderListener -->
  <listener>
      <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>

  <!-- Declare a Spring MVC DispatcherServlet as usual -->
  <servlet>
      <servlet-name>dispatcher</servlet-name>
      <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
      <!-- Configure DispatcherServlet to use AnnotationConfigWebApplicationContext
           instead of the default XmlWebApplicationContext -->
      <init-param>
          <param-name>contextClass</param-name>
          <param-value>
              org.springframework.web.context.support.AnnotationConfigWebApplicationContext
          </param-value>
      </init-param>
      <!-- Again, config locations must consist of one or more comma- or space-delimited
           and fully-qualified @Configuration classes -->
      <init-param>
          <param-name>contextConfigLocation</param-name>
          <param-value>com.acme.web.MvcConfig</param-value>
      </init-param>
  </servlet>

  <!-- map all requests for /app/* to the dispatcher servlet -->
  <servlet-mapping>
      <servlet-name>dispatcher</servlet-name>
      <url-pattern>/app/*</url-pattern>
  </servlet-mapping>
</web-app>
Tolitius
quelle
Hallo, ich verwende hier nicht Spring MVC, sondern nur JSF und Spring 3.1 RC1. Ich habe dieses Servlet zwar in meine web.xml geschrieben, aber immer noch den gleichen Fehler "kein ContextLoaderListener registriert" erhalten. Ich habe dann einen Eintrag für die Listener-Klasse von Spring gemacht und dann einen anderen Fehler von applicationContext.xml nicht gefunden. Ich hoffe, ich mache meinen Standpunkt klar.
Mital Pritmani
Hey, ich habe es geschafft, als ich diese 2 Parameter als Kontextparameter und Spring Listener-Klasse in web.xml hinzugefügt habe. Danke, Ihre Antwort hat mir geholfen, meine Antwort herauszufinden. Ich bearbeite Ihre Antwort, um meine Lösung hinzuzufügen. Bitte genehmigen Sie es (da ich keine Bearbeitungsrechte habe), damit ich Ihre Antwort als endgültig markieren kann.
Mital Pritmani
Ich habe Ihre Bearbeitungsanfrage nie erhalten, aber ich habe meine Antwort mit einem Beispiel eines vollständigen web.xmlFormulars der offiziellen Spring-Dokumentation aktualisiert .
Tolitius
In meiner Webanwendungskonfiguration musste ich <load-on-startup>1</load-on-startup>im Dispatcher-Servlet haben. Ohne diesen Dispatcher müssen nicht geladen werden
Marioosh
@tolitius, danke für diesen Kommentar <!-- Configure DispatcherServlet to use AnnotationConfigWebApplicationContext instead of the default XmlWebApplicationContext -->in Ihrer Antwort, da er mir geholfen hat, den Punkt zu
Plain_Dude_Sleeping_Alone
11

Hier wird eine alte Frage aufgeworfen, aber mit den neuesten Versionen von Spring (v3.0 +) können Sie web.xml jetzt vollständig entfernen, vorausgesetzt, Sie stellen Ihre App in einem Webcontainer bereit, der Servlet 3.0+ unterstützt.

Man kann die Spring- WebApplicationInitializerSchnittstelle implementieren , um die gleichen Konfigurationen wie in web.xml durchzuführen. Diese Implementierungsklasse wird automatisch von der Spring 3.0+ -App erkannt, die auf Servlet 3.0+ -Containern ausgeführt wird.

Wenn die Einrichtung ziemlich einfach ist, können Sie stattdessen eine andere von Spring bereitgestellte Klasse verwenden, wie unten gezeigt. Hier müssen Sie lediglich die @ Configuration-Klassen festlegen und die Servlet-Zuordnungen auflisten. Hält die Einrichtung extrem einfach.

public class WebInit extends AbstractAnnotationConfigDispatcherServletInitializer{

    @Override
    protected Class<?>[] getRootConfigClasses() {
        return null;
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {

        return new Class[] {AppConfig.class};
    }

    @Override
    protected String[] getServletMappings() {
        return new String[] {
                 "*.html"
                ,"*.json"
                ,"*.do"};
    }
}
Angad
quelle
2
Wenn Sie versuchen, web.xml loszuwerden, stellen Sie sicher, dass Sie einen Container verwenden, der Servlet 3.0 wie Tomcat 7.0.57 unterstützt . PS Steve, gute Arbeit mit den führenden Kommas!
Justin Wrobel
Das stimmt. Ich werde das in die Antwort werfen. Vielen Dank
Angad