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?
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:
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>
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"};
}
}