2011-03-09 22 views
9

में स्प्रिंग बीन्स इंजेक्ट करें मैं @Interceptors(SpringBeanAutowiringInterceptor.class) का उपयोग कर स्प्रिंग बीन्स को ईजेबी में इंजेक्ट करने की कोशिश कर रहा हूं लेकिन मैं इसे beanRefContext.xml उदाहरणों के साथ काम नहीं कर सकता।ईजेबी 3

@Stateless 
@Interceptors(SpringBeanAutowiringInterceptor.class) 
public class AlertNotificationMethodServiceImpl implements 
     AlertNotificationMethodService { 

    @Autowired 
    private SomeBean bean; 
} 

इस प्रकार मैं एक beanRefContext.xml प्रदान की है::

यहाँ मेरी EJB है

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="..."> 

    <!-- Have also tried with ClassPathXmlApplicationContext --> 
    <bean id="context" 
     class="org.springframework.web.context.support.XmlWebApplicationContext"> 
     <property name="configLocations" value="/config/app-config.xml" /> 
    </bean> 

</beans> 

लेकिन, यह सेम पुनः किए जाने की बजाय मौजूदा ApplicationContext प्राप्त करने लगता है। मैं निम्नलिखित अपवाद के साथ समाप्त होता हूं क्योंकि मेरे सेम में से एक ServletContextAware है।

java.lang.IllegalArgumentException: Cannot resolve ServletContextResource 
without ServletContext 

SpringBeanAutowiringInterceptor का उपयोग करते समय ApplicationContext प्राप्त नहीं करना चाहिए के बजाय एक नया बना?

मैंने अपने web.xml को बदलने का भी प्रयास किया ताकि संदर्भ कॉन्फिगोकेशन बीनआरफ कॉन्टेक्स्ट.एक्सएमएल को इंगित कर सके, उम्मीद है कि यह मेरी स्प्रिंग कॉन्फ़िगरेशन लोड करेगा, लेकिन मैं उपरोक्त के समान अपवाद के साथ समाप्त होता हूं।

क्या किसी को यह ठीक से कैसे करना है? मैंने जो उदाहरण देखे हैं, वे उसी विधि का उपयोग करते हैं जो मैं उपयोग कर रहा हूं जिसका अर्थ है कि मुझे लगता है कि जब इंटरसेप्टर को बुलाया जाता है तो बीन्स को फिर से बनाया जा रहा है (या यह है कि यह कैसे काम करना चाहिए और मैंने गलत समझा है)।

+0

पूरी प्रक्रिया को समझाते हुए एक उपयोगी लिंक: http://techo-ecco.com/blog/spring-plplication-context-hierarchy-and-contextsingletonbeanfactorylocator/ – omartin

उत्तर

11

SpringBeanAutowiringInterceptor का उपयोग करते समय ApplicationContext प्राप्त नहीं करना चाहिए के बजाय एक नया बना?

हां, और यह वास्तव में यह क्या करता है। यह ContextSingletonBeanFactoryLocator तंत्र का उपयोग करता है, जो बदले में कई ApplicationContext स्थिर सिंगलटन के रूप में उदाहरण प्रबंधित करता है (हां, यहां तक ​​कि वसंत को कभी-कभी स्थैतिक सिंगलेट का सहारा लेना पड़ता है)। इन संदर्भों को beanRefContext.xml में परिभाषित किया गया है।

आपका भ्रम अपेक्षा से अपेक्षा करता है कि इन संदर्भों के आपके वेबैप के ApplicationContext से कोई संबंध है - वे नहीं हैं, वे पूरी तरह से अलग हैं। तो आपके वेबएप का ContextLoaderapp-config.xml में बीन परिभाषाओं के आधार पर एक संदर्भ बना रहा है और प्रबंधित कर रहा है, और ContextSingletonBeanFactoryLocator एक और बनाता है। जब तक आप उन्हें नहीं बताएंगे तब तक वे संवाद नहीं करेंगे। ईजेबी वेबपैप के संदर्भ को पकड़ नहीं सकते हैं, क्योंकि ईजेबी उस दायरे से बाहर बैठते हैं।

आपको क्या करना है बीन्स को स्थानांतरित करना है जिसे आपके ईजेबी द्वारा app-config.xml और अन्य बीन परिभाषा फ़ाइल में उपयोग करने की आवश्यकता है। बीन परिभाषाओं का यह निकाला गया सेट एक नए ApplicationContext का आधार बन जाएगा जो (ए) ईजेबी द्वारा उपयोग किया जाएगा, और (बी) आपके वेबएप के संदर्भ के मूल संदर्भ के रूप में कार्य करेगा।

अपने वेबपैड के संदर्भ और नए संदर्भ के बीच अभिभावक-बाल लिंक को सक्रिय करने के लिए, आपको पर parentContextKey नामक अतिरिक्त <context-param> जोड़ने की आवश्यकता है। इस पैरामीटर का मान आपके उदाहरण में beanRefContext.xml (यानी context) में परिभाषित संदर्भ का नाम होना चाहिए।

वेबपैड के संदर्भ में पीछे रहने वाले बीन्स मूल संदर्भ में बीन्स को संदर्भित करने में सक्षम होंगे, जैसे कि ईजेबी। हालांकि, ईजेबी वेबपैप के संदर्भ में कुछ भी संदर्भित नहीं कर पाएंगे।

इसके अलावा, आप beanRefContext.xml में XmlWebApplicationContext उपयोग कर सकते हैं नहीं है, क्योंकि उस वर्ग webapp के बारे में जागरूकता की आवश्यकता है, और ContextSingletonBeanFactoryLocator कि जागरूकता की आपूर्ति नहीं कर सकते। आपको वहां ClassPathXmlApplicationContext के साथ रहना चाहिए।

+0

मुझे अंत में एहसास हुआ कि मैं इसे सब गलत देख रहा था। जब मैं ऐप को तैनात करता हूं तो अनुप्रयोग संदर्भ बनाने के बजाय, जब मैं इंटरसेप्टर कहलाता हूं तो मैं इसे बना देता हूं। मैं मानता था कि ContextSingletonBeanFactoryLocator वेब ऐप संदर्भ का पता लगाने में सक्षम होगा, लेकिन यह वास्तव में एक एकल संदर्भ के रूप में एक ऐप संदर्भ बनाता है। उत्तर के लिए धन्यवाद, स्काफमैन, आप इतने स्मार्ट हैं - वर्चुअल योड की तरह। – ravun

+3

@ravun: आपको अपने संदर्भों को वायर करें, हां – skaffman

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