2009-09-23 11 views
7

Gdy używam DispatcherServlet, dostaję java.lang.IllegalStateException: Brak WebApplicationContext: brak ContextLoaderListener konta? błąd, gdy używam filtru DelegowanieFilterProxy . Dlatego usunąłem DispatcherServlet, a teraz używam zamiast tego ContextLoaderListener, a moja aplikacja Spring ładuje się prawidłowo. Jednak mam problem z jednym bardzo ważnym Fasola:DefaultAnnotationHandlerMapping poprzez ContextLoaderListener zamiast DispatcherServlet na wiosnę 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> 

Ta fasola nie działa żaden z URL są mojego @ sterownika odwzorowaną więcej. Jeśli przełożę się ponownie na używanie DispatcherServlet, nie ma problemu (z tym że mój filtr znów jest bezużyteczny). Jak mogę poprawnie załadować komponent bean z poziomu ContextLoaderListener?

Cheers

Nik

Odpowiedz

22

Trzeba zarówno ContextLoaderListeneriDispatcherServlet - komunikat o błędzie nie powiedzieć, aby usunąć aplet.

Aby wyjaśnić, co wiosna robi Tutaj DispatcherServlet tworzy własny ApplicationContext (zazwyczaj przy użyciu xxx-servlet.xml), ale żadnych filtrów Wiosna konfigurowane w web.xml nie mają dostępu do apletu ApplicationContext.

Tworzy drugą ContextLoaderListener tworzy drugą ApplicationContext (powiązaną z całą aplikacją webapp) i łączy się z serwletem ApplicationContext, umożliwiając komunikację filtrów i serwletów za pośrednictwem Spring.

+0

Aha! To jest BARDZO klarowne. :-) Ale, czy masz jakieś dobre linki na temat tego, jak mogę skonfigurować ContextLoaderListener do zanurzenia w kontekście serwletu lub na odwrót? Ponieważ kiedy używam obu, to tworzy on dwa komponenty bean dwa razy (z wyjątkiem DefaultAnnotationHandler i pod warunkiem, że ustawiłem contextCamfigLocation kontekstu do pliku konfiguracyjnego serwletu.Jeśli utworzę osobny plik konfiguracyjny, muszę skopiować/wkleić fasolę do uwierzytelniania lub importowania danych i warstwy biznesowej, dzięki czemu wszystkie te ziarna są dwa razy .Jak mogę je mieć tylko raz? – niklassaers

+2

Kontekst aplikacji utworzony przez ContextLoaderListener jest kontekstem nadrzędnym dla kontekstu aplikacji serwletu. KontextLoaderListener appcontext są automatycznie widoczne dla ziaren w appcontext serwletu (ale nie na odwrót), więc wszystkie, które są wspólne, powinny być zadeklarowane w rodzicu. – skaffman

+0

Dziękuję bardzo, nie wiedziałem o tym. Poprawiłem moją konfigurację, a teraz wszystko działa znakomicie. :-) Dziękuję bardzo i dziękuję za wszystkie inne czasy, w których mi pomogłeś. Zdecydowanie muszę kupić ci kilka piw :-) – niklassaers

1

Jednak web.xml podstawowej aplikacji MVC Spring nie ma ContextLoaderListener? Zobacz https://src.springframework.org/svn/spring-samples/mvc-basic/trunk/src/main/webapp/WEB-INF/web.xml.

Pytam o to, bo dostaję następujący błąd w mojej aplikacji:

ERROR [[Wiosna MVC Dyspozytor Servlet]] Servlet.service() przez aplet wiosennym MVC dyspozytora serwletu wyrzucił wyjątek java.lang .IllegalStateException: Nie znaleziono aplikacji WebApplicationContext: nie zarejestrowano ContextLoaderListener?

i nie mam ContextLoaderListener (co może powodować problem).

Masz pytania dotyczące tego, dlaczego podstawowa aplikacja MVC będzie działać?

+0

Ten moduł mvc-basic działa, ponieważ używa tylko filtru org.springframework.web.filter.CharacterEncodingFilter i ten filtr nie wymaga kontekstu aplikacji Spring do pracy. –