2011-12-16 13 views
15

को वसंत आवेदन संदर्भ घटनाओं को पाटने के मैं दो संदर्भों के साथ एक स्प्रिंग वेब अनुप्रयोग हैं: एक (applicationContext) ContextLoaderListener और एक दूसरे (webContext) द्वारा बनाया DispatcherServlet द्वारा बनाया गया।कैसे एक अन्य संदर्भ

applicationContext के भीतर एक बीन (org.springframework.security.authentication.DefaultAuthenticationEventPublisher) है जो वसंत संदर्भ घटनाओं को सक्रिय करता है।

लेकिन घटना के लिए रिसीवर webContext में परिभाषित किया गया है। और उस रिसीवर को घटना नहीं मिली। (यदि applicationContext में परीक्षण उद्देश्य के लिए रिसीवर रखा तो यह घटना मिलता है, लेकिन क्योंकि मैं अपनी कार्यक्षमता के लिए webContext रों जरूरत है मैं ऐसा नहीं कर सकते।)

तो मेरे सवाल है, कैसे से घटनाओं पुल करने के लिए applicationContext से webContext?

+0

आप अपनी समस्या के लिए किसी भी समाधान मिला? –

+0

मैं डिजाइन द्वारा अनुमान लगा रहा हूं वसंत आपको ऐसा करने की अनुमति नहीं देता है। अन्यथा यह बहुत भ्रमित नहीं होगा यदि आप डीबगिंग कर रहे हैं कि किस वर्ग ने इस आयोजन को संभाला था? अब एक कंटेनर के भीतर देखने की बजाय, आपको सभी – gerrytan

उत्तर

3

ईवेंट प्रकाशक को वेब संदर्भ फ़ाइल में ले जाने का प्रयास करें, जहां इसे पूरे एप्लिकेशन संदर्भ पर दृश्यता होनी चाहिए। एक समान समस्या तब होती है जब configuring method security in the parent application context। अभिभावक अनुप्रयोग संदर्भ (ContextLoaderListener द्वारा लोड किया गया) बच्चे (वेब) संदर्भ से अवगत नहीं है।

यदि आप वास्तव में दोनों के बीच माता-पिता के संबंधों की आवश्यकता नहीं है तो आप पूरे एप्लिकेशन के लिए एक एकल एप्लिकेशन संदर्भ का भी उपयोग कर सकते हैं। अक्सर यह रास्ते में आता है और सभी बीन्स एक ही स्थान में परिभाषित किए जाने पर यह आसान होता है।

+0

देखना होगा यह समाधान नहीं हो सकता है, क्योंकि प्रश्न दो संदर्भों को कैसे संभालना है। (मैं सुरक्षा संदर्भ को वेब संदर्भ में नहीं ले जा सकता, क्योंकि मैं इसे एप्लिकेशन में उपयोग करने की व्याख्या करता हूं (यह एसीएल के साथ एक एप्लीकेशन है))। – Ralph

+0

क्या आपको वास्तव में दो अलग-अलग एप्लिकेशन संदर्भों की आवश्यकता है? यह एक ऐसी स्थिति की तरह लगता है जहां यह सिर्फ एक होना आसान हो सकता है। –

+0

यह बहुत बेहतर लगता है। मैं जांच करूंगा कि मैंने दो संदर्भ क्यों उपयोग किए, और देखो कि मैं उन्हें विलय कर सकता हूं या नहीं। – Ralph

2

वसंत ढांचे के लिए प्रलेखन में कहा गया है कि सरल एप्लिकेशनइवेंट तंत्र केवल उसी एप्लिकेशन संदर्भ में उपयोग करने के लिए डिज़ाइन किया गया है, मुझे पता नहीं है कि घटनाओं को बाल संदर्भों में प्रसारित करना संभव है।

यदि आपको अधिक उन्नत समाधान की आवश्यकता है तो आप जावा संदेश सेवा या वसंत एकीकरण जैसे अधिक उन्नत समाधान का उपयोग कर सकते हैं।

http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#context-functionality-events

0

हम 2 अलग एक तरह से घटनाओं/सेम ​​की दृश्यता उपलब्ध और साझा कर रहे हैं में बनाए गए संदर्भों आयात/पुल करने के लिए आयात टैग का उपयोग कर सकते हैं।

<import resource="applicationContext_name.xml"/> 

इस आयात में संदर्भ एक्सएमएल जो DispatcherServlet के संदर्भ एक्सएमएल में ContextLoaderListener से बनाया जा करने के लिए कॉन्फ़िगर किया गया है।

4

मुझे लगता है कि वास्तविक जवाब तो आप अपनी ऐप्लिकेशन कॉन्फ़िगर कर (ताकि आप केवल एक संदर्भ है) मैं अपने web.xml में लगता है कि आप कुछ इस तरह करने की जरूरत है चाहते हो सकता है वह यह है कि:

<servlet> 
    <servlet-name>example</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <load-on-startup>1</load-on-startup> 
    <init-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>    
      classpath:/META-INF/applicationSpringConfig.xml 
     </param-value> 
    </init-param> 
</servlet> 

लेकिन गहरे सवाल का जवाब देने के लिए। कोई और बताता है कि आप अपनी वसंत फ़ाइल में शामिल कर सकते हैं (वास्तव में उपरोक्त में आप अपने प्रेषक सर्वलेट में निर्दिष्ट एक से अधिक springconfig हो सकते हैं)। लेकिन जब आप अन्य संदर्भ फ़ाइलों को शामिल करते हैं तो आप केवल बीन्स के उदाहरण साझा नहीं करते हैं, केवल परिभाषाएं।

मॉड्यूलरिंग स्प्रिंग अनुप्रयोग ईजेबी आदि की तुलना में वसंत का एकमात्र असली नकारात्मक पक्ष रहा है। इससे वसंत ओएसजीआई का उपयोग करने में हुआ। और कैसे वसंत संदर्भ साझा करने के लिए, आधिकारिक तौर पर आप OSGi (वसंत डीएम)

6

मैं एक ही समस्या थी, हल मेरा उपयोग कर वेब को घटना का निर्माण सेम ले जाकर संदर्भों के बीच वसंत सेम उदाहरणों का हिस्सा की अपनी अंतर्निहित सवाल का जवाब -context।हालांकि आप मैन्युअल रूप से इस तरह आपके घटना श्रोता, कुछ तारों से आपकी समस्या का समाधान कर सकते हैं (इस कोड को संकलित नहीं है इसलिए यह अपरीक्षित है):

@Component  
public class BeanInWebContext implements ApplicationListener<SomeEvent> { 

    @Autowired 
    private ApplicationContext webContext; 

    @PostConstruct 
    public void registerAsListener() { 
     // get parent context 
     AbstractApplicationContext appContext = (AbstractApplicationContext) webContext.getParent(); 
     // register self as a listener, this method is in AbstractApplicationContext 
     appContext.addApplicationListener(this); 
    } 

    @Override 
    public void onApplicationEvent(SomeEvent event) { 
    } 

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