2013-04-11 18 views
21

私はSpring MVC REST APIを開発中です。すべてがうまくいきますが、ログから気づいたのは、アプリケーションを再起動するたびにapplicationContextが2回読み込まれることです.1回はTomcatがwarファイルを読み込むときで、もう1回はWebアプリケーションが初めてアクセスされたときですクライアント。Spring MVC Webアプリケーション:アプリケーションコンテキストが2回開始する

私はいくつかの例をあげる:...

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 

をそして私は、最初のAPI呼び出しを行い、現時点で:私はTomcatを起動した直後

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 

確かにこれは正常な動作ではありませんか?私のweb.xmlは次のようになります。 "

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

次の質問に選択された回答はありませんが、多分まだ助けてくれるかもしれません:http://stackoverflow.com/q/11409237/866172 – Jalayn

+0

最初の回答は私には当てはまりません。そして、2番目の答えは私のために働いていないのと同じ理由でOPのために働いていませんでした。 – Hendrik

+0

@Jalayn upvote - あなたは基本的に答えを指します – ikumen

答えて

22

mvc-dispatcherは2倍をロードしていますそれはあなたが

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

<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> 
でそれを定義した方法であるため、

最初のアプローチは、通常、 "グローバル"または "ルート"コンテキストのようなものをロードすることです。ここで、複数のサーブレットコンテキストで共有されるすべてのBean /リソースを配置できます。

第2のアプローチは、通常、特定のサーブレットコンテキストをロードする方法です。最初のanswer in this postが指摘するように、命名規則を使用してmvc-dispatcher設定ファイルを検索するので、明示的に定義する必要はありません。

mvc-dispatcher-servlet.xmlにすべてが定義されていますか?もしそうなら、あなたは

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

定義を削除することができ、そうでなければ、(私は将来の保守のためにお勧めしている)複数のファイルにコンフィギュレーションを分離することができます。 root-context.xml(最初の方法で)のようなもので共有Bean /リソースをロードし、サーブレットコンテキストごとにservletname-servlet.xmlの下にある各サーブレット固有の設定をロードします。

+1

私は結局それを働かせました: applicationContext.xmlはありません。そこで作成したのは、のすべてをmvc-dispatcher.xmlからapplicationContext.xmlに移動しました。それから、mvc-dispatcher.xmlに欠けていたものがいくつかあったのでいくつか問題がありました。を追加しなければならなかった。 – Hendrik

+0

私は同じ問題を持っていたし、(のDispatcherServletと)以下の構成を使用して解決: ' の残りの部分のorg.springframework.web.servlet。DispatcherServlet ​​ contextConfigLocation /WEB-INF/rest-servlet.xml 1 ' –

関連する問題