2015-01-09 5 views
6

मेरे पास एक एप्लिकेशन श्रोता है जो केवल वेबपैड स्टार्टअप के बाद केवल एक बार निष्पादित करना है, क्योंकि यह मूल उपयोगकर्ता जानकारी डेटा लोड करता है।स्प्रिंग एप्लिकेशन लिस्टनर वेबपैप पर दो बार निकाल दिया जाता है

public class DefaultUsersDataLoader implements ApplicationListener<ContextRefreshedEvent> { 
    @Override 
    @Transactional 
    public void onApplicationEvent(ContextRefreshedEvent e) {...} 
} 

किसी भी तरह, इसे दो बार निष्पादित किया जाता है: ऐप स्टार्टअप पर और जब पहला अनुरोध सर्वर पर आता है। यह क्यों हो रहा है और मैं इसे कैसे रोक सकता हूं?

+0

पद web.xml के साथ अपने श्रोता वर्ग की विधि एनोटेट मत करो .... – Braj

+0

मैं एक ही समस्या थी। @EventListener को हटाने से समस्या हल हो गई। क्या किसी के पास स्पष्टीकरण होगा? –

उत्तर

11

आम तौर पर एक स्प्रिंग एमवीसी अनुप्रयोग में आपके पास ContextLoaderListener और DispatcherServlet दोनों हैं। दोनों घटक अपने ApplicationContext बनाते हैं जो बदले में ContextRefreshedEvent आग लगाता है।

DispatcherServletApplicationContext का उपयोग करता है जैसा कि ContextLoaderListener द्वारा उसके माता-पिता के रूप में बनाया गया है। बाल संदर्भों से निकाल दी गई घटनाओं को मूल संदर्भ में प्रचारित किया जाता है।

अब यदि आपके पास रूट संदर्भ में परिभाषित ApplicationListener<ContextRefreshedEvent> है (जिसे ContextLoaderListener द्वारा लोड किया गया है) तो उसे दो बार एक ईवेंट प्राप्त होगा।

+5

धन्यवाद। मैंने इसे 'e.getAplicationContext() के साथ अस्वीकार कर दिया। GetParent()! = Null', लेकिन यह थोड़ा हैकी लगता है। मुझे आश्चर्य है कि क्या एक बेहतर अभ्यास है? –

+0

वास्तव में, यदि श्रोता पहले से ही लागू किया गया था तो आप एक बुलियन टॉगल कर सकते थे। यदि यह केवल कुछ डेटा लोड करने के लिए है और आप स्प्रिंग 4.1 का उपयोग कर रहे हैं तो आप ['SmartInitializingSingleton'] (http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/beans का भी उपयोग कर सकते हैं /factory/SmartInitializingSingleton.html) इसके बजाए। –

+0

आप यह भी सुनिश्चित करना चाहते हैं कि वेब संदर्भ आपके नियंत्रकों के अलावा किसी भी बीन्स को तुरंत चालू न करे। यानी घटक स्कैन बेस पैकेज को केवल 'वेब' पैकेज में शामिल करने के लिए लागू करें, जो नियंत्रकों और अन्य ऐसे बीन्स के लिए माता-पिता है। यह सुनिश्चित करना चाहिए कि आपका श्रोता केवल रूट संदर्भ में मौजूद है, और इसलिए केवल रूट संदर्भ घटनाओं को उठाएगा। – Steve

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