2009-09-23 5 views
7

Lorsque j'utilise DispatcherServlet, je reçois un java.lang.IllegalStateException: Aucun WebApplicationContext trouvé: pas ContextLoaderListener enregistré? Erreur lorsque j'utilise un filtre DelegatingFilterProxy. Par conséquent, j'ai supprimé le DispatcherServlet et maintenant j'utilise un ContextLoaderListener à la place, et mon application Spring se charge bien. Cependant, j'ai un problème avec un haricot très important:DefaultAnnotationHandlerMapping via ContextLoaderListener au lieu de DispatcherServlet Spring 3

<context:component-scan base-package="com.mydomain"/> 
    <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"> 
     <property name="interceptors"> 
     <list> 
      <ref bean="openSessionInViewInterceptor" /> 
     </list> 
     </property> 
    </bean> 

Ce haricot ne fonctionne plus, aucun de mes @ URL de contrôleur de cartographiés sont-plus. Si je repasse à utiliser DispatcherServlet, pas de problème (sauf que mon filtre est à nouveau inutile). Comment puis-je charger ce bean correctement depuis un ContextLoaderListener?

Vive

Nik

Répondre

22

Vous avez besoin du ContextLoaderListeneret le DispatcherServlet - le message d'erreur n'a pas vous dire de retirer le servlet.

Pour clarifier ce printemps fait ici, l'DispatcherServlet crée sa propre ApplicationContext (typiquement en utilisant xxx-servlet.xml), mais tous les filtres de printemps que vous configurez dans web.xml ne pas avoir accès aux ApplicationContext de la servlet.

Le ContextLoaderListener crée une seconde ApplicationContext (associée à l'ensemble webapp), et se lie avec ApplicationContext, permettant des filtres et des servlets de la servlet pour communiquer via Spring.

+0

Aha! C'est TRÈS clarifiant. :-) Mais, avez-vous de bons liens sur la façon dont je peux configurer le ContextLoaderListener pour qu'il plonge dans le contexte de la Servlet ou inversement? Parce que quand j'utilise les deux, il instancie chaque bean deux fois (excepté le DefaultAnnotationHandler, et à condition d'avoir défini contextConfigLocation de context-param dans le fichier de configuration de servlet.) Si je crée un fichier de configuration séparé, je dois copier/coller les beans – niklassaers

+2

L'appcontext créé par ContextLoaderListener est le contexte parent de l'appcontext de la servlet, ce qui signifie que les beans de l'application doivent être authentifiés ou importés. Le contexte d'application de ContextLoaderListener est automatiquement visible par les beans dans le contexte d'application de la servlet (mais pas dans l'autre sens), de sorte que tous ceux qui sont partagés doivent être déclarés dans le parent. – skaffman

+0

Merci beaucoup, je n'étais pas au courant de cela. J'ai corrigé ma config en conséquence, et maintenant tout fonctionne avec brio. :-) Merci beaucoup, et merci pour toutes les autres fois où vous m'avez aidé ici. Je dois absolument vous acheter quelques bières :-) – niklassaers

1

Le fichier web.xml de l'application de base Spring MVC ne possède cependant pas de ContextLoaderListener? Voir https://src.springframework.org/svn/spring-samples/mvc-basic/trunk/src/main/webapp/WEB-INF/web.xml.

Je pose la question parce que je reçois l'erreur suivante dans mon application:

erreur [[Spring MVC Dispatcher Servlet]] Servlet.service() pour servlet Spring MVC Dispatcher Servlet a jeté exception java.lang .IllegalStateException: Non WebApplicationContext trouvé: non ContextLoaderListener enregistré?

et je n'ai pas de ContextLoaderListener (ce qui est susceptible de provoquer le problème).

Vous ne savez pas pourquoi l'application de base MVC fonctionnera?

+0

Ce mvc-basic fonctionne car il utilise uniquement le filtre org.springframework.web.filter.CharacterEncodingFilter et ce filtre n'a pas besoin du contexte Spring Application pour fonctionner. –

Questions connexes