2012-06-06 8 views
5

मेरी समस्या का हिस्सा यहां उचित शब्दावली का उपयोग कर रहा है, इसलिए मैं पहले से माफी माँगता हूं कि शब्दावली का एक साधारण मामला क्या हो सकता है।मैं एक सीडीआई निर्माता विधि के उपयोग को कैसे मजबूर करूं?

मान लीजिए कि मेरे पास Person इंटरफ़ेस है, और PersonBean कक्षा जो उस इंटरफ़ेस को लागू करती है।

मान लीजिए कि मेरे पास कहीं निर्माता निर्माता है (एनोटेटेड @Produces) जो Person देता है। आंतरिक रूप से यह एक नया PersonBean देता है, लेकिन यह न तो यहां और न ही वहां है।

अंत में, मैं एक इंजेक्शन बिंदु इस तरह परिभाषित के साथ एक और CDI सेम कहीं लगता है:

@Inject 
private Person person; 

मान लिया जाये कि मैं जगह आदि में मेरे सभी beans.xml फ़ाइलें और वेल्ड या किसी अन्य CDI-1.0-अनुपालक को चलाया है, पर्यावरण, क्योंकि यह सब खड़ा है मुझे एक अस्पष्ट परिभाषा त्रुटि मिलेगी। यह समझ में आता है: वेल्ड इंजेक्शन के लिए उम्मीदवार के रूप में मेरा PersonBean पायेगा (यह केवल कन्स्ट्रक्टर को कॉल कर सकता है) और इंजेक्शन के लिए उम्मीदवार के रूप में मेरे निर्माता विधि का आउटपुट पायेगा।

मैं जो करना चाहता हूं वह किसी भी तरह से उत्पादक विधि के माध्यम से हमेशा इस मार्ग में Person उदाहरणों के उत्पादन को मजबूर करता है।

मुझे समझ में आता है कि मैं कहीं कुछ क्वालीफायर का आविष्कार कर सकता हूं और निर्माता विधि को Person उदाहरणों का उत्पादन कर सकता हूं जो कि क्वालीफायर द्वारा योग्य हैं। यदि मैं ऐसा करता हूं, और क्वालीफायर को शामिल करने के लिए अपना इंजेक्शन पॉइंट बदलता हूं, तो स्पष्ट रूप से इन योग्य इंजेक्टेबल (अर्थात् मेरे निर्माता विधि) का केवल एक स्रोत होता है, इसलिए voila, समस्या हल हो जाती है।

लेकिन मान लीजिए कि मैं कुछ फर्जी क्वालीफायर का आविष्कार नहीं करना चाहता हूं। (मैं यह नहीं कह रहा हूं कि यह मामला है; बस मुद्दों को और गहराई से समझने की कोशिश कर रहे हैं।) मेरे विकल्प क्या हैं? क्या मेरे पास कोई है? मुझे लगता है मैं PersonBean पर @Typed(Object.class) डाल इसे बनाने के लिए इतना है कि यह CDI द्वारा एक Person के रूप में नहीं देखा गया था सकता है लगता है ....

किसी भी प्रलेखन के संकेत दिए गए हैं, या बेहतर तरीके से समझा जा सहित स्वागत विचारों,। धन्यवाद।

उत्तर

2

यहां और कहीं और कई अलग-अलग उत्तरों को पचाने से, मैंने जो समाधान अपनाया है, वह @Typed एनोटेशन का उपयोग Object.class के मूल्य के साथ मेरे बीन पर करना है।इसका मतलब यह है कि यह केवल क्षेत्रों है कि इस तरह की घोषणा की जाती में इंजेक्ट किया जा करने के लिए पात्र होंगे:

@Inject 
private Object something; 

... जो शुक्र काफी अस्तित्वहीन साबित हो। :-)

1

मुझे क्या करना चाहते हैं किसी भी तरह निर्माता विधि के माध्यम से हमेशा रूट करने के लिए इस आवेदन में उदाहरणों व्यक्ति के उत्पादन के लिए मजबूर है।

सीम सोल्डर has a solution इसके लिए।

मुझे 100% यकीन नहीं है कि यह सीम 3 और Deltaspike के विलय के साथ कैसे विकसित होगा (पृष्ठ इतना 90 है, लेकिन सामग्री चट्टानें :-), लेकिन आपके क्लासपाथ में सोल्डर डालना निश्चित रूप से एक सुरक्षित शर्त है।

ओह, और जहां तक ​​मुझे एक तुलनीय तंत्र पता है, इसे सीडीआई 1.1 spec में बनाया गया है।

+0

तो मूल रूप से: सीडीआई 1.0 में '@ टाइप की गई एनोटेशन का उपयोग करके इसे मजबूर नहीं कर सकता है? –

+0

मुझे यकीन नहीं है कि मैं आपकी टिप्पणी समझता हूं। आप सोल्डर से '@ अनवरप्स 'का उपयोग कर स्वतंत्र रूप से उत्पादन को मजबूर कर सकते हैं। और सीडीआई में '@ टाइपेड' जैसी कोई चीज़ नहीं है ...! –

+0

'@ टाइप किया गया ': http://docs.oracle.com/javaee/6/api/javax/enterprise/inject/Typed.html संक्षेप में, आप बीन प्रकारों को वापस फेंक देते हैं जो आपके बीन सीडीआई इनकारों के सामने आते हैं। यह सीडीआई मशीनरी को आपके ऑब्जेक्ट से हाथ रखने और अपने निर्माता विधि को तुरंत चालू करने की इजाजत देने का एक तरीका होगा। मेरा उपयोग केस 'लॉगर' इंस्टेंस (कोई नो-एर्ग कन्स्ट्रक्टर!) बना रहा है ताकि मैं लॉग ऑन होने पर 'LogRecord' के प्रकार को नियंत्रित कर सकूं। –

3

आपको व्यक्तिगत विकल्प के रूप में व्यक्तिगत रूप से एनोटेट करें तो यह निर्माता विधि का उपयोग करेगा।

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