2012-03-29 18 views
7

मुझे स्प्रिंग बीन में @Resource के रूप में एनोटेटेड फ़ील्ड के साथ परेशानी हो रही है। मैं क्या है:वसंत @ संसाधन हैंडलिंग

एक क्षेत्र, सेटर विधि के साथ, @Resource

@Resource 
private URL someUrl; 

public void setSomeUrl(URL someUrl) { 
    this.someUrl = someUrl; 
} 

एक <env-entry> टैग एनोटेट मेरी तैनाती डिस्क्रिप्टर में (web.xml)

<env-entry> 
    <env-entry-name>someUrl</env-entry-name> 
    <env-entry-type>java.net.URL</env-entry-type> 
    <env-entry-value>http://somedomain.net/some/path</env-entry-value> 
</env-entry> 

आवेदन एक साथ शुरू करने के लिए विफल रहता है BeanCreationException, जिसे मैं उम्मीद नहीं करता क्योंकि मैं अनिवार्य रूप से स्प्रिंग-प्रबंधित बीन इंजेक्ट करने के लिए वसंत नहीं चाहता हूं। मैं वसंत @Resource को संसाधित करना चाहता हूं और जेएनडीआई संसाधन पुनर्प्राप्त करना चाहता हूं।

यह वसंत 2.5.6SEC03 है और बीन स्वयंको अन्य @Component उदाहरणों में ऑटोवॉयरिंग के लिए एनोटेट किया गया है। इस मामले में सर्वलेट कंटेनर टॉमकैट 7 है लेकिन आखिरकार वेबलॉगिक 10 पर तैनात किया जाएगा, इसलिए जब मैं आदर्श रूप से दोनों पर काम करने के लिए समाधान करना चाहता हूं, तो वेबलॉगिक होना आवश्यक है।

क्या मैं इस सुविधा को स्प्रिंग 2.5 में दुरुपयोग कर रहा हूं? सामान्य रूप में? क्या मुझे कुछ याद आ रही है? मैं जेएनडीआई के बारे में कुछ गलत समझता हूं? सभी मदद की सराहना की है। धन्यवाद।

उत्तर

7

आप स्प्रिंग स्टीरियोटाइप एनोटेशन का उपयोग कर रहे हैं, (@Service, @Component ...), तो आप शायद <context:component-scan /> तत्व उन्हें लेने के लिए अपने वसंत विन्यास में शामिल कर रहे हैं। ऐसा करना ठीक है, लेकिन यह स्वचालित रूप से CommonAnnotationBeanPostProcessor को एप्लिकेशन संदर्भ, as stated just above the second note in this link के साथ स्वचालित रूप से पंजीकृत करेगा।

CommonAnnotationBeanPostProcessor समेत समस्या यह है कि वसंत @Resource एनोटेशन को संभालती है और इसके अनुप्रयोग संदर्भ से सेम इंजेक्ट करने का प्रयास करेगी। आप अपना खुद का CommonAnnotationBeanPostProcessor बीन पंजीकृत कर सकते हैं और संपत्ति true पर सेट करके बीन को कॉन्फ़िगर करके इन @Resource तक सीधे जेएनडीआई पहुंच की अनुमति देने के लिए स्प्रिंग को बता सकते हैं। लिंक किए गए दस्तावेज में टिप्पणी करने के लिए

<bean class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor"> 
    <property name="alwaysUseJndiLookup" value="true"/> 
</bean> 

वेतन ध्यान:

नोट: एक डिफ़ॉल्ट CommonAnnotationBeanPostProcessor दर्ज करेगा, "संदर्भ: एनोटेशन-config" और "संदर्भ: घटक स्कैन" एक्सएमएल टैग । यदि आप एक कस्टम CommonAnotationBeanPostProcessor बीन परिभाषा निर्दिष्ट करने का इरादा रखते हैं तो डिफ़ॉल्ट एनोटेशन कॉन्फ़िगरेशन को हटाएं या बंद करें!

+0

बढ़िया, यह पूरी तरह से काम किया! मैंने यह भी पाया कि आप एनोटेशन बॉडी में "मैप किए गए नाम" के लिए मान को स्पिस्फी करके जेएनडीआई लुकअप करने के लिए कॉमनएनोटेशनबीनपोस्ट प्रोसेसर को मजबूर कर सकते हैं। जो कुछ भी कहा, और इस काम के बाद, मैंने सीखा कि हमारी मानक कॉर्पोरेट तैनाती प्रक्रिया एकाधिक तैनाती वर्णनकर्ताओं का समर्थन नहीं करेगी। मुझे सभी तैनाती में एक ही का उपयोग करना चाहिए। तो, यह दृष्टिकोण काम नहीं करेगा। –