2012-07-10 20 views
5

Mam projekt internetowy z bezpieczeństwem wiosennym i wiosennym. Moja web.xml:Dlaczego kontekst wiosny jest ładowany dwa razy?

<web-app xmlns="http://java.sun.com/xml/ns/javaee" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
     version="3.0" > 
     <display-name>BillBoard 
     </display-name> 
     <session-config> 
      <session-timeout> 
       30 
      </session-timeout> 
     </session-config> 
     <listener> 
      <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
     </listener> 
     <listener> 
      <listener-class>org.springframework.security.web.session.HttpSessionEventPublisher</listener-class> 
     </listener> 
     <context-param> 
      <param-name>contextConfigLocation</param-name> 
      <param-value>classpath:security-config.xml classpath:billboard-servlet.xml</param-value> 
     </context-param> 
     <servlet> 
      <servlet-name>billboard</servlet-name> 
      <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
      <init-param> 
       <param-name>contextConfigLocation</param-name> 
       <param-value>classpath:security-config.xml classpath:billboard-servlet.xml</param-value> 
      </init-param> 
      <load-on-startup>1</load-on-startup> 

     </servlet> 
     <servlet-mapping> 
      <servlet-name>billboard</servlet-name> 
      <url-pattern>*.html</url-pattern> 
     </servlet-mapping> 
     <filter> 
      <filter-name>springSecurityFilterChain</filter-name> 
      <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> 
     </filter> 

     <filter-mapping> 
      <filter-name>springSecurityFilterChain</filter-name> 
      <url-pattern>/*</url-pattern> 
     </filter-mapping> 
    </web-app> 

W dziennikach serwerów widzę kontekst Wiosna jest załadowany dwa razy (wiosna fasola inicjalizacji, createtion bazy danych ...). Po raz pierwszy robi to DispatcherServlet, a po raz drugi ContextLoaderListener. Jak mogę to naprawić?

W samouczku this Widzę, że jeśli przedstawiono parametr contextParam, to nie są wymagane serwlety init serwletu. Ale jeśli usuwam params init, mam błąd: "org.apache.catalina.LifecycleException: org.apache.catalina.LifecycleException: java.io.FileNotFoundException: Nie można otworzyć zasobu ServletContext [/WEB-INF/billboard-servlet.xml] ". Serwlet dispather znajduje kontekstową konfigurację w domyślnej lokalizacji.

Odpowiedz

2

Są to dwie niezależne metody, aby zrobić to samo. Na przykład upuść ContextLoaderListener.

+0

Jeśli zrzucę contextLoaderListener, mam wyjątek "java.lang.IllegalStateException: Nie znaleziono aplikacji WebApplicationContext: nie zarejestrowano ContextLoaderListener?" – Balconsky

+0

A jeśli upuścisz 'contextConfigLocation'? –

+0

Próbowałem usunąć parametr Context lub init-param z DispatcherServlet, ale obie opcje powodują błędy. – Balconsky

6

Trzeba jeszcze kontekst dla serwletu:

Upon initialization of a DispatcherServlet, Spring MVC looks for a file named [servlet-name]-servlet.xml in the WEB-INF directory of your web application and creates the beans defined there, overriding the definitions of any beans defined with the same name in the global scope.

Nie trzeba ładować go jako context-param w ContextLoaderListener chociaż.

prostu zostawić security-config.xml jak context-param (ma tam, jak bezpieczeństwo jest za światowy aplikacji), jak i billboard-servlet.xmlcontextConfigLocation swojej serwletu i powinno działać.

+0

Dla bazy danych użytkownika Uwierzytelnianie I, więc zdefiniowałem źródło danych w pliku billboard-servlet.xml i odwołuję się do tej właściwości w moim uwierzytelnianiuProvider. – Balconsky

+0

jeśli twoje źródło danych jest używane poza twoim serwletem, to nie powinno być w 'billboard-servlet.xml'. Wrzuć to do swojego głównego kontekstu - serwlet i tak to odziedziczy. – soulcheck

3

miałem ten sam problem i powodem było:

<load-on-startup>1</load-on-startup

+0

Powodowało to dwukrotne załadowanie kontekstu. Usunięto go i żadnych skutków ubocznych. –

1

Skoro masz wiosna delegatingFilterProxy, jeśli spadek contextLoaderLister dostaniesz poniższy wyjątek.

java.lang.IllegalStateException: No WebApplicationContext found: 
no ContextLoaderListener registered? 

Więc załadować security-config.xml poprzez contextLoaderLister i billboard-servlet.xml przez dyspozytora serwletu.

Powiązane problemy