68 votes

Comment enregistrer Printemps @Configuration annoté de la classe au lieu de applicationContext.xml fichier dans web.xml?

Je suis en utilisant jsf et ressort dans l'application web. J'ai configuré la source de données et de la session de l'usine dans une configuration de classe qui utilise les annotations comme @Configuration, @ComponentScan etc. Je n'ai pas de applicationContext.xml fichier dans mon projet comme je suis de la manipulation de chaque entrée de contexte xml de Configuration de la classe. Le cas de test fonctionne correctement mais quand je déployer mon application web, il me donne l'erreur

java.lang.IllegalStateException: Pas de WebApplicationContext trouvé: aucun ContextLoaderListener enregistré?

Maintenant, si je donne à l'auditeur de classe dans web.xml,

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

il me donne l'erreur,

/WEB-INF/applicationContext.xml pas trouvé

Selon le document de l' ContextLoaderListener, il est vrai que si je ne donne pas de contextConfigLocation param en web.xml explicitement, il va rechercher le défaut printemps contexte fichier nommé applicationContext.xml en web.xml. Maintenant, que dois-je faire si je ne veux pas utiliser de printemps de fichier de contexte et de faire toute la configuration avec des annotations? Comment dois-je m'inscrire classe écouteur ContextLoaderListener , de sorte que, sans l'utilisation de fichier xml et l'utilisation d'annotations seulement, je être en mesure d'exécuter mon application web avec spring et jsf?

133voto

tolitius Points 9816

En web.xml vous avez besoin pour amorcer 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 votre MVC annotations à coup de pied dans.

pour en savoir plus:

Monter un "commentaires suivi" => pour être Turing:

Oui bien sûr, vous avez besoin d'un auditeur. Bien que le dessus entièrement répond à la question "Comment s'inscrire Printemps @Configuration annoté de la classe au lieu de applicationContext.xml fichier dans web.xml"voici un exemple à partir du Printemps de la documentation officielle que les dispositions de l'intégralité 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>

11voto

singh101 Points 194

Cogner une vieille question ici, mais avec les versions récentes de Printemps (v3.0+) maintenant, vous pouvez vous débarrasser de web.xml tout à fait. On peut mettre en œuvre le Printemps de l' WebApplicationInitializer interface pour effectuer les mêmes configurations que l'on pourrait faire dans web.xml. Il est automatiquement détecté par le Printemps 3.0+ conteneurs.

Si la mise en place est assez simple, vous pouvez à la place utiliser une autre classe fournie par le Printemps comme indiqué ci-dessous. Tous on fait ici est de mettre le @classes de Configuration et de la liste de la servlet mappages. Maintient le programme d'installation 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"};
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X