2013-04-11 3 views
21

मैं एक स्प्रिंग एमवीसी रीस्ट एपीआई पर काम कर रहा हूं। सबकुछ ठीक काम करता है, जो बहुत अच्छा है, लेकिन मैंने लॉग से देखा है कि हर बार जब मैं अपने ऐप को पुनरारंभ करता हूं तो एप्लिकेशन कॉन्टेक्स्ट दो बार लोड होता है: एक बार जब टोमकैट युद्ध फ़ाइल लोड करता है, और दूसरी बार जब वेब ऐप पहली बार एक्सेस किया जाता है ग्राहक।स्प्रिंग एमवीसी वेब ऐप: एप्लिकेशन संदर्भ दो बार शुरू होता है

मैं कुछ उदाहरण दे देंगे:

ठीक बाद मैं बिल्ला शुरू:

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 कॉल करें:

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

दिया गया पहला उत्तर मेरे लिए लागू नहीं होता है। और दूसरा जवाब मेरे लिए एक ही कारण से काम नहीं करता है, यह ओपी – Hendrik

+0

@ जलायन अपवोट के लिए काम नहीं करता है - आप मूल रूप से – ikumen

उत्तर

22

mvc-dispatcher 2x लोड कर रहा है क्योंकि है कि आप इसे कैसे

<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> 
पर है

पहला दृष्टिकोण आम तौर पर "वैश्विक" या "रूट" संदर्भ जैसे कुछ लोड करने के लिए होता है, जहां आप एकाधिक सर्वलेट संदर्भों द्वारा साझा किए गए सभी बीन/संसाधन डाल सकते हैं।

दूसरा दृष्टिकोण आमतौर पर एक विशिष्ट सर्वलेट संदर्भ लोड करने के लिए होता है। पहले answer in this post अंक के रूप में, यह mvc-dispatcher config फ़ाइल को खोजने के लिए नामकरण सम्मेलन का उपयोग करता है, इसलिए आपको इसे स्पष्ट रूप से परिभाषित करने की आवश्यकता नहीं है।

क्या आपके पास mvc-dispatcher-servlet.xml में परिभाषित सब कुछ है? ताकि आप

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

परिभाषा को दूर कर सकते हैं, अन्यथा आप (जो मैं भविष्य रख-रखाव के लिए सलाह देते हैं) आपके विन्यास से अधिक फ़ाइलों में अलग कर सकते हैं। फिर प्रत्येक servlet संदर्भ के लिए servletname-servlet.xml के तहत रूट-context.xml (पहली विधि के माध्यम से) और प्रत्येक सर्वलेट विशिष्ट कॉन्फ़िगरेशन में साझा बीन्स/संसाधन लोड करें।

+1

के उत्तर की ओर इशारा करते हैं, मुझे अंत में यह काम मिल गया: जब मैंने संदर्भ-पैरा को हटा दिया तो यह शिकायत करता है कि कोई अनुप्रयोग Context.xml नहीं है। तो मैंने एक बनाया, मैंने अपने सभी को mvc-dispatcher.xml से applicationContext.xml में ले जाया। तब मुझे कुछ समस्याएं थीं क्योंकि कुछ सामान mvc-dispatcher.xml में गायब थे: मुझे एक <संदर्भ: घटक-स्कैन /> और एक वहां जोड़ा गया था और फिर सबकुछ काम करता था। – Hendrik

+0

मैं एक ही मुद्दा था और (DispatcherServlet के साथ) निम्नलिखित विन्यास का उपयोग कर हल: ' <सर्वलेट-नाम> बाकी <सर्वलेट स्तरीय> org.springframework.web.servlet।DispatcherServlet contextConfigLocation /WEB-INF/rest-servlet.xml <लोड-ऑन-स्टार्टअप> 1 ' –

संबंधित मुद्दे