2013-04-11 11 views
21

Sto lavorando su un'API REST Spring MVC. Funziona tutto bene, il che è fantastico, ma ho notato dai registri che ogni volta che riavvio la mia applicazione, applicationContext viene caricata due volte: una volta quando Tomcat carica il file war e una seconda volta quando l'app Web viene acceduta per la prima volta da un cliente.Spring MVC web app: contesto applicativo inizia due volte

Darò alcuni esempi:

Subito dopo mi metto il gatto:

Apr 11, 2013 10:14:35 AM org.apache.catalina.core.StandardEngine start 
INFO: Starting Servlet Engine: Apache Tomcat/6.0.32 
Apr 11, 2013 10:14:36 AM org.apache.catalina.core.ApplicationContext log 
INFO: Initializing Spring root WebApplicationContext 
2013-04-11 10:14:36 INFO ContextLoader:273 - Root WebApplicationContext:  initialization started 
2013-04-11 10:14:36 INFO XmlWebApplicationContext:510 - Refreshing Root  WebApplicationContext: startup date [Thu Apr 11 10:14:36 EDT 2013]; root of context hierarchy 
2013-04-11 10:14:36 INFO XmlBeanDefinitionReader:315 - Loading XML bean definitions  from ServletContext resource [/WEB-INF/mvc-dispatcher-servlet.xml] 
2013-04-11 10:14:36 INFO XmlBeanDefinitionReader:315 - Loading XML bean definitions from class path resource [config-general.xml] 
2013-04-11 10:14:37 INFO XmlBeanDefinitionReader:315 - Loading XML bean definitions from class path resource [config-db.xml] 
2013-04-11 10:14:37 INFO XmlBeanDefinitionReader:315 - Loading XML bean definitions from class path resource [config-security.xml] 
2013-04-11 10:14:37 INFO SpringSecurityCoreVersion:33 - You are running with Spring Security Core 3.1.3.RELEASE 
2013-04-11 10:14:37 INFO SecurityNamespaceHandler:59 - Spring Security 'config' module version is 3.1.3.RELEASE 

...

E poi in questo momento faccio la prima chiamata API:

INFO: Initializing Spring FrameworkServlet 'mvc-dispatcher' 
2013-04-11 10:15:25 INFO DispatcherServlet:455 - FrameworkServlet 'mvc-dispatcher': initialization started 
2013-04-11 10:15:25 INFO XmlWebApplicationContext:510 - Refreshing WebApplicationContext for namespace 'mvc-dispatcher-servlet': startup date [Thu Apr 11  10:15:25 EDT 2013]; parent: Root WebApplicationContext 
2013-04-11 10:15:25 INFO XmlBeanDefinitionReader:315 - Loading XML bean definitions from ServletContext resource [/WEB-INF/mvc-dispatcher-servlet.xml] 
2013-04-11 10:15:25 INFO XmlBeanDefinitionReader:315 - Loading XML bean definitions from class path resource [config-general.xml] 
2013-04-11 10:15:25 INFO XmlBeanDefinitionReader:315 - Loading XML bean definitions from class path resource [config-db.xml] 
2013-04-11 10:15:25 INFO XmlBeanDefinitionReader:315 - Loading XML bean definitions from class path resource [config-security.xml] 
2013-04-11 10:15:25 INFO SecurityNamespaceHandler:59 - Spring Security 'config' module version is 3.1.3.RELEASE 

Sicuramente questo comportamento non può essere normale ?? Il mio web.xml si presenta così:

http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd ">

<display-name>REST API</display-name> 

<!-- Servlets --> 
<servlet> 
    <servlet-name>mvc-dispatcher</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
</servlet> 
<servlet-mapping> 
    <servlet-name>mvc-dispatcher</servlet-name> 
    <url-pattern>/</url-pattern> 
</servlet-mapping> 
<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value>/WEB-INF/mvc-dispatcher-servlet.xml</param-value> 
</context-param> 

<!-- filters --> 
<filter> 
    <filter-name>httpMethodFilter</filter-name> 
    <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>httpMethodFilter</filter-name> 
    <servlet-name>mvc-dispatcher</servlet-name> 
</filter-mapping> 
<filter> 
    <filter-name>etagFilter</filter-name> 
    <filter-class>org.springframework.web.filter.ShallowEtagHeaderFilter</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>etagFilter</filter-name> 
    <servlet-name>mvc-dispatcher</servlet-name> 
</filter-mapping> 
<filter> 
    <filter-name>CompressingFilter</filter-name> 
    <filter-class>com.planetj.servlet.filter.compression.CompressingFilter</filter-class> 
    <init-param> 
     <param-name>debug</param-name> 
     <param-value>false</param-value> 
    </init-param> 
    <init-param> 
     <param-name>statsEnabled</param-name> 
     <param-value>false</param-value> 
    </init-param> 
</filter> 
<filter-mapping> 
    <filter-name>CompressingFilter</filter-name> 
    <servlet-name>mvc-dispatcher</servlet-name> 
</filter-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> 



<!-- listeners --> 
<listener> 
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
</listener> 

+3

la seguente domanda non ha una risposta selezionata, ma forse potrebbe ancora aiutare: http://stackoverflow.com/q/11409237/866172 – Jalayn

+0

la prima risposta data non si applica a me. E la seconda risposta non funziona per me per la stessa ragione per cui non ha funzionato per l'OP – Hendrik

+0

@Jalayn upvote - tu fondamentalmente hai indicato la risposta – ikumen

risposta

22

mvc-dispatcher sta caricando 2x perché è così che avete definito lo

<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value>/WEB-INF/mvc-dispatcher-servlet.xml</param-value> 
</context-param> 

e al

<servlet> 
    <servlet-name>mvc-dispatcher</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
</servlet> 
<servlet-mapping> 
    <servlet-name>mvc-dispatcher</servlet-name> 
    <url-pattern>/</url-pattern> 
</servlet-mapping> 

il primo approccio è in genere il caricamento di qualcosa come un contesto "globale" o "root", in cui è possibile mettere tutti i bean/risorse condivise da più contesti servlet.

Il secondo approccio è in genere per caricare un contesto servlet specifico. Come indicato dal primo answer in this post, utilizza la convenzione di denominazione per trovare il file di configurazione di mvc-dispatcher, quindi non è necessario definirlo esplicitamente.

Avete tutto definito in mvc-dispatcher-servlet.xml? Se è così è possibile rimuovere la definizione

<context-param> 
    .. 
</context-param> 

, altrimenti è possibile (che vi consiglio per il futuro manutenibilità) separare la configurazione in più file. Quindi caricare bean/risorse condivise in qualcosa come root-context.xml (tramite il primo metodo) e ogni configurazione specifica del servlet sotto servletname-servlet.xml per ogni contesto servlet.

+1

alla fine ho funzionato: quando ho cancellato il contesto-param si lamenta che non c'è applicationContext.xml. Così ne ho creato uno, ho spostato tutti i miei da mvc-dispatcher.xml a applicationContext.xml. Poi ho avuto alcuni problemi perché mancava del materiale in mvc-dispatcher.xml: dovevo aggiungere un e un lì e poi tutto funzionava. – Hendrik

+0

Ho avuto lo stesso problema e risolto utilizzando la seguente configurazione (con DispatcherServlet): ' resto org.springframework.web.servlet.DispatcherServlet contextConfigLocation /WEB-INF/rest-servlet.xml 1 ' –

Problemi correlati