2012-07-10 22 views
5

Tengo un proyecto web con seguridad de primavera y primavera. Mi web.xml:¿Por qué Spring Context se carga dos veces?

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

En los registros del servidor veo contexto primavera se carga dos veces (inicialización de frijol de primavera, createtion base de datos ...). En el primer momento, DispatcherServlet lo hace, y en el segundo tiempo ContextLoaderListener. ¿Cómo puedo arreglarlo?

En this tutorial veo que si se presenta contextParam, entonces los servlets init-params no son necesarios. Pero si elimino los parametros init, tengo un error: "org.apache.catalina.LifecycleException: org.apache.catalina.LifecycleException: java.io.FileNotFoundException: No se pudo abrir el recurso ServletContext [/WEB-INF/billboard-servlet.xml] ". El servlet de Dispather encuentra la configuración de contexto en la ubicación predeterminada.

Respuesta

2

Estos son dos métodos independientes para hacer lo mismo. Suelta el ContextLoaderListener, por ejemplo.

+0

Si elimino contextLoaderListener, tengo la excepción "java.lang.IllegalStateException: no se encontró WebApplicationContext: no ContextLoaderListener registered?" – Balconsky

+0

Y si suelta 'contextConfigLocation'? –

+0

He intentado eliminar Context param o init-param de DispatcherServlet, pero ambas opciones arrojan errores. – Balconsky

6

usted todavía necesita un contexto para el 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.

No es necesario para cargarlo como context-param en el ContextLoaderListener sin embargo.

Acaba de salir de la security-config.xml como context-param (tiene que ir allí, ya que la seguridad es global por aplicación), y billboard-servlet.xml como contextConfigLocation de nuestro servlet y debería funcionar.

+0

Para autenticación, el usuario de DataBase, así que definí dataSource en billboard-servlet.xml y lo hice referencia como propiedad en mi AuthenticationProvider. – Balconsky

+0

si su fuente de datos se usa fuera de su servlet, no debería estar en 'billboard-servlet.xml'. Ponlo en tu contexto raíz: el servlet lo heredará de todos modos. – soulcheck

3

que tenían el mismo problema y la razón era:

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

+0

Esto provocaba que el contexto se cargara dos veces. Lo eliminó y no tiene efectos secundarios. –

1

Ya que tienes la primavera delegatingFilterProxy, si se le cae contextLoaderLister obtendrá la excepción a continuación.

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

Así que cargar con la seguridad a través de config.xml contextLoaderLister y cartelera-servlet.xml través servlet despachador.

Cuestiones relacionadas