2009-09-23 9 views
7

Quando uso DispatcherServlet, ottengo un java.lang.IllegalStateException : No WebApplicationContext trovato: no ContextLoaderListener registrato? errore quando utilizzo un filtro DelegatingFilterProxy. Pertanto ho rimosso il DispatcherServlet e ora utilizzo uno ContextLoaderListener e l'applicazione Spring viene caricata correttamente. Tuttavia, ho un problema con un chicco molto importante:DefaultAnnotationHandlerMapping via ContextLoaderListener invece di DispatcherServlet su 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> 

Questo fagiolo non funziona più, nessuno di URL sono il mio @ del controller mappati più. Se torno a utilizzare DispatcherServlet, nessun problema (tranne che il mio filtro è di nuovo inutile). Come posso caricare correttamente questo bean dall'interno di ContextLoaderListener?

Acclamazioni

Nik

risposta

22

È necessario sia il ContextLoaderListenere il DispatcherServlet - il messaggio di errore non ti ha detto di rimuovere la servlet.

di chiarire che cosa primavera sta facendo qui, il DispatcherServlet crea un proprio ApplicationContext (in genere utilizzando xxx-servlet.xml), ma eventuali filtri di primavera che si configurano in web.xml non hanno accesso al servlet del ApplicationContext.

Il ContextLoaderListener crea un secondo ApplicationContext (associato con l'intero webapp), e si collega con la servlet ApplicationContext, filtri permettendo e servlet per comunicare tramite molla.

+0

Aha! Questo è MOLTO chiarificante. :-) Ma, hai qualche link valido su come posso configurare ContextLoaderListener per immergerlo nel contesto di Servlet o viceversa? Perché quando uso entrambi, crea un'istanza di ogni bean due volte (ad eccezione di DefaultAnnotationHandler e a condizione che abbia impostato contextConfigLocation contest-param sul file di configurazione del servlet. Se creo un file di configurazione separato, devo copiare/incollare i bean per l'autenticazione o l'importazione dei dati e del livello aziendale, rendendo così tutti questi bean due volte Come posso mantenerli una sola volta? – niklassaers

+2

Il contesto app creato da ContextLoaderListener è il contesto padre del contesto app del servlet. Ciò significa che i bean nel L'appcontext di ContextLoaderListener è automaticamente visibile ai bean nel appcontext del servlet (ma non viceversa), quindi tutti i file condivisi devono essere dichiarati nel genitore. – skaffman

+0

Grazie mille, non ne ero consapevole. Ho risolto la mia configurazione di conseguenza, e ora tutto funziona brillantemente. :-) Grazie mille, e grazie per tutte le altre volte che mi hai aiutato qui. Ho sicuramente bisogno di comprarti un paio di birre qualche volta :-) – niklassaers

1

Il web.xml dell'app di base Spring MVC non ha tuttavia un ContextLoaderListener? Vedi https://src.springframework.org/svn/spring-samples/mvc-basic/trunk/src/main/webapp/WEB-INF/web.xml.

motivo che mi chiedo è perché sto ottenendo il seguente errore nella mia domanda:

ERRORE [[Spring MVC Dispatcher Servlet]] Servlet.service() per servlet Spring MVC Dispatcher Servlet ha gettato un'eccezione java.lang .IllegalStateException: nessun WebApplicationContext trovato: nessun ContextLoaderListener registrato?

e non ho un ContextLoaderListener (che è probabile che causi il problema).

Qualche idea sul motivo per cui l'app di base MVC funzionerà?

+0

Questo mvc-basic funziona perché utilizza solo il filtro org.springframework.web.filter.CharacterEncodingFilter e questo filtro non ha bisogno del contesto dell'applicazione Spring per funzionare. –

Problemi correlati