2011-05-28 14 views
15

मेरे पास ContextRefreshed ईवेंट सुनने के लिए एक स्प्रिंग एप्लिकेशन लिस्टर बीन पंजीकृत है। कुछ अजीब कारणों के लिए, मुझे दो संदर्भ प्रारंभिकरण के पूरा होने पर onApplicationEvent(ContextRefreshedEvent) विधि पर कॉल किया गया है। क्या यह सामान्य व्यवहार है या यह मेरी विन्यास के साथ एक समस्या का संकेत है? मैं अपने सर्वलेट कंटेनर के लिए जेट्टी 8 का उपयोग कर रहा हूं।मेरा स्प्रिंग कॉन्टेक्स्ट रीफ्रेशेड इवेंट दो बार क्यों बुलाया जाता है?

मेरे प्रासंगिक web.xml विन्यास के रूप में इस प्रकार है

<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value>/WEB-INF/config/spring/spring-config.xml</param-value> 
</context-param> 
<servlet> 
    <servlet-name>Spring</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <init-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value></param-value> 
    </init-param> 
<load-on-startup>1</load-on-startup> 
</servlet> 
<listener> 
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
</listener> 
<servlet-mapping> 
    <servlet-name>Spring</servlet-name> 
    <url-pattern>/service/*</url-pattern> 
</servlet-mapping> 

धन्यवाद है!

उत्तर

23

भले ही आपने एक संदर्भ निर्दिष्ट नहीं किया है, तो अपने डिस्पैचर सर्विलेट के लिए कॉन्फिग लोकेशन अभी भी एक बाल संदर्भ बनाता है और दूसरी ताज़ा घटना उस संदर्भ के लिए है। ईवेंट का पता लगाने के लिए event.getAplicationContext() का उपयोग करें।

+1

वह था! एप्लिकेशनकॉन्टेक्स्ट I की 'id' या' displayName' प्रॉपर्टी 'का उपयोग करके अब मैं दो घटनाओं के बीच अंतर कर सकता हूं। – Andre

+3

या यदि आप ऐपकॉन्टेक्स्ट (या एप्लिकेशनकॉन्टेक्स्टवेयर को कार्यान्वित करें) का उपयोग करते हैं तो आप ईवेंट में एक बनाम ऐपकॉन्टेक्स्ट की तुलना कर सकते हैं। – sourcedelica

+0

@Andre ए नोब का सवाल: ContextRefreshedEvent से आईडी या प्रदर्शन नाम का उपयोग कैसे करें? –

1

यह बग की तरह दिखता है।

https://jira.springsource.org/browse/SPR-6589

आप 3.0 उपयोग कर रहे हैं नवीनतम उपलब्ध रिहाई 3.05 है पर यह प्रयास करें।

+0

ठीक है, हम प्रयोग कर रहे 3.0.4 इसलिए मैं के साथ सिर्फ बुनियादी न्यूनतम web.xml को विन्यस्त बिना एक स्प्रिंग आवेदन 3.0.5 एक शॉट दे देंगे और मेरे निष्कर्षों की रिपोर्ट करेगा। – Andre

+0

बह, 3.0.5 तक अपग्रेड किया गया और यह अभी भी एक मुद्दा है। – Andre

+0

यहां तक ​​कि 3.1 एक ही मुद्दा है। – Deckard

1

मुझे यह समस्या भी थी लेकिन इसे ठीक किया गया। मैं अपने डीएओ में डेटासोर्स इंजेक्शन दे रहा था (और इसके साथ एक जेडीबीसी टेम्पलेट को तत्काल) .... लेकिन मेरे पास जेडीबीसीटीप्लेट के लिए एक स्प्रिंग बीन भी कॉन्फ़िगर किया गया था।

मुझे अपने डीएओ को jdbc टेम्पलेट के साथ इंजेक्शन देना चाहिए था ... जो डुप्लिकेट से बचाता है।

2

यह एक अलग घटना-श्रोता पर भी मेरे साथ हुआ। (ApplicationListener<AuthenticationFailureBadCredentialsEvent>)

मैं ContextLoaderListener संदिग्ध, और जब मैं web.xml से घोषणा हटा दिया, एप्लिकेशन ठीक से कार्य किया गया था। तब मैं यह पता लगाने की ContextLoaderListener की, इसका उद्देश्य है क्या खाया ...

Role/Purpose of ContextLoaderListener in Spring?

दिलचस्प जवाब है:

ContextLoaderListener वैकल्पिक है। बस एक बात यहाँ बनाने के लिए: आप कर सकते हैं बूट अप कभी ContextLoaderListener ... DispatcherServlet

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