web-dev-qa-db-fra.com

Comment enregistrer la classe annotée Spring @Configuration au lieu du fichier applicationContext.xml dans web.xml?

J'utilise jsf et spring ensemble dans une application web. J'ai configuré la source de données et la fabrique de sessions dans une classe de configuration qui utilise des annotations telles que @Configuration, @ComponentScan etc. Je n'ai pas de fichier applicationContext.xml dans mon projet car je gère chaque entrée du contexte xml dans la classe de configuration. Le scénario de test fonctionne correctement, mais lorsque je déploie mon application Web, des erreurs se produisent.

Java.lang.IllegalStateException: Aucun WebApplicationContext trouvé: aucun ContextLoaderListener enregistré?

Maintenant, si je donne la classe d'auditeur dans web.xml,

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

ça me donne une erreur

/WEB-INF/applicationContext.xml introuvable

Selon le document de ContextLoaderListener, il est vrai que si je ne donne pas contextConfigLocation param dans web.xml _ explicitement, il recherchera le fichier de contexte par défaut appelé applicationContext.xml dans web.xml. Maintenant, que dois-je faire si je ne veux pas utiliser le fichier de contexte Spring et faire toute la configuration avec des annotations? Comment dois-je enregistrer la classe d'écoute ContextLoaderListener pour que, sans l'utilisation du fichier xml et uniquement des annotations, je puisse exécuter mon application Web avec spring et jsf?

67
Mital Pritmani

Dans web.xml vous devez bootstrap le contexte avec 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>

Et n'oubliez pas d'utiliser @EnableWebMvc pour que vos annotations MVC entrent en jeu.

lectures supplémentaires:

EDIT comme un "suivi des commentaires" => être Turing Complete:

Oui, bien sûr, vous avez besoin d'un auditeur. Bien que ce qui précède réponde complètement à la question " Comment enregistrer la classe annotée Spring @Configuration au lieu du fichier applicationContext.xml dans web.xml ", voici un - exemple tiré de la documentation officielle de Spring qui présente la totalité du 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>
132
tolitius

Je vais vous poser une vieille question, mais avec les versions récentes de Spring (v3.0 +), vous pouvez désormais vous débarrasser de web.xml, à condition de déployer votre application sur un conteneur Web prenant en charge Servlet 3.0+.

On peut implémenter l'interface WebApplicationInitializer de Spring pour effectuer les mêmes configurations que dans le fichier web.xml. Cette classe d'implémentation sera automatiquement détectée par l'application Spring 3.0+ s'exécutant sur les conteneurs Servlet 3.0+.

Si la configuration est assez simple, vous pouvez utiliser une autre classe fournie par Spring, comme indiqué ci-dessous. Tout ce qu'on fait ici est de définir les classes @Configuration et de lister les mappages de servlets. Garde la configuration extrêmement simple.

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"};
    }
}
11
Angad