2012-07-10 17 views
5

Ho un progetto web con sicurezza Spring and Spring. mio web.xml:Perché il contesto di primavera viene caricato due volte?

<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> 

nei log dei server vedo contesto primavera viene caricato due volte (l'inizializzazione di fagioli primavera, banca dati createtion ...). Alla prima volta, DispatcherServlet lo fa, e al momento della secessione ContextLoaderListener. Come posso ripararlo?

In this tutorial vedo che se viene presentato contextParam, i servlet init-param non sono richiesti. Ma se rimuovo i parametri init ho un errore: "org.apache.catalina.LifecycleException: org.apache.catalina.LifecycleException: java.io.FileNotFoundException: impossibile aprire la risorsa ServletContext [/WEB-INF/billboard-servlet.xml] ". Il servlet Dispather trova la configurazione del contesto nella posizione predefinita.

risposta

2

Questi sono due metodi indipendenti per fare la stessa cosa. Lascia cadere il ContextLoaderListener, per esempio.

+0

Se lascio contextLoaderListener, ho Eccezione "java.lang.IllegalStateException: No WebApplicationContext trovato: nessun ContextLoaderListener registrato?" – Balconsky

+0

E se si rilascia 'contextConfigLocation'? –

+0

Ho provato a rimuovere il parametro Context o init-param da DispatcherServlet, ma entrambe le opzioni generano errori. – Balconsky

6

hai ancora bisogno di un contesto per il vostro servlet:

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.

Non è necessario per caricarlo come context-param nel ContextLoaderListener però.

Basta lasciare la security-config.xml come context-param (deve andare lì, come la sicurezza è globale per ogni applicazione), e billboard-servlet.xml come contextConfigLocation del servlet e dovrebbe funzionare.

+0

Per l'utente I DataBase di autenticazione, quindi ho definito dataSource in billboard-servlet.xml e lo riferimento come proprietà nel mio AuthenticationProvider. – Balconsky

+0

se l'origine dati viene utilizzata all'esterno del servlet, non dovrebbe essere in 'billboard-servlet.xml'. Mettilo nel tuo contesto di root - il servlet lo erediterà comunque. – soulcheck

3

Ho avuto lo stesso problema e il motivo era:

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

+0

Ciò causava il caricamento del contesto due volte. Rimosso e senza effetti collaterali. –

1

Dal momento che hai primavera delegatingFilterProxy, se si lascia cadere contextLoaderLister si otterrà l'eccezione di seguito.

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

Quindi caricare la sicurezza-config.xml tramite contextLoaderLister e cartellone-servlet.xml tramite servlet dispatcher.

Problemi correlati