2014-10-20 9 views
7

वाइल्डफ्लाई 8.1 का उपयोग करना मेरे पास कई बीन्स हैं जिन्हें मैं एक दूसरे में कई ईजेबी इंजेक्ट करने का प्रयास करता हूं। आइए कहें कि मेरे पास 3 सेम हैं:क्यों स्टेटलेस बीन्स छद्म-स्कोप्ड के रूप में माना जाता है और सर्कुलर निर्भरता नहीं हो सकती है?

@Stateless 
public class A{ 
    @Inject 
    private B b; 
} 

@Stateless 
public class B{ 
    @Inject 
    private C c; 
} 

@Stateless 
public class C{ 
    @Inject 
    private A a; 
} 

जाहिर है, मेरे पास परिपत्र निर्भरता है। विनिर्देश के अनुसार:

कंटेनर सेम निर्भरता ग्राफ जहां कम से कम एक सेम निर्भरता के हर परिपत्र श्रृंखला में भाग लेने वाले एक सामान्य दायरे

के कोड से ऊपर चल रहा है है में circularities का समर्थन करने के लिए आवश्यक है फार्म की एक त्रुटि में कंटेनर परिणाम:

org.jboss.weld.exceptions.DeploymentException: वेल्ड-001,443: छद्म scoped सेम परिपत्र निर्भरता है। निर्भरता पथ:

-सत्र बीन [कक्षा ए क्वालीफायर [@Default @Any] के साथ; स्थानीय इंटरफ़ेस हैं [एक] BackedAnnotatedField] @Inject निजी बी,

[..]

मेरा प्रश्न यहाँ है: @Stateless सेम की गुंजाइश क्या है? क्या यह डिफ़ॉल्ट रूप से @ निर्भर है? और सबसे अधिक मैं स्टेटलेस सत्र बीन्स के बीच परिपत्र निर्भरताओं को कैसे सक्षम कर सकता हूं?

क्षमा करें यदि प्रश्न बहुत छोटा है। मैं किसी भी अच्छे आगे पढ़ने वाले स्रोतों की सराहना करूंगा जो प्रस्तुत व्यवहार की व्याख्या करेंगे। अग्रिम में धन्यवाद।

अद्यतन ठीक है। मुझे कामकाज मिला। मैंने @ इंजेक्ट के बजाय @EJB एनोटेशन का उपयोग किया है लेकिन यह @ इंजेक्ट के अजीब व्यवहार की व्याख्या नहीं करता है। सवाल खुला रहता है लेकिन जैसा कि मिका ने सुझाव दिया है कि यह दोनों सीडीआई विनिर्देश और वेल्ड आरआई में अनसुलझा मुद्दा हो सकता है।

+0

का उपयोग कर मुझे ऐसा जवाब नहीं है के द्वारा होता है, लेकिन यह एक तुच्छ सवाल नहीं है। सीडीआई ईजी सदस्यों के बीच इस बारे में एक चर्चा हुई थी। सीडीआई स्पेस जिरा को देखो, इस विषय के बारे में एक मुद्दा होना चाहिए। –

+0

@ माइकब्रौन क्या आप शायद जिरा मुद्दे पर एक लिंक प्रदान कर सकते हैं? मैंने खोज की है लेकिन मुझे यकीन नहीं है कि मैं सही देख रहा हूं। – iku

+0

यह सीडीआई -414 है, https://issues.jboss.org/browse/CDI-414 –

उत्तर

9

यह जंगली/jboss सीडीआई कार्यान्वयन में एक बग है। वर्तमान वर्कअराउंड (जैसा कि @ माइकब्रौन द्वारा सुझाया गया है), अंक विवरण https://issues.jboss.org/browse/CDI-414 में प्रदान किया गया है, @ इंजेक्ट के बजाय @EJB एनोटेशन का उपयोग करना है।

3

@Stateless का कोई दायरा नहीं है और किसी भी दायरे से कोई सहसंबंध नहीं है। आपके सेम @Dependent के रूप में समाप्त हो रहे हैं क्योंकि आपने अपने सेम पर किसी भी अन्य दायरे को एनोटेट नहीं किया है।

आपको उन्हें एक सामान्य दायरा - @RequestScoped या @ApplicationScoped देने की आवश्यकता है, हालांकि मुझे यकीन नहीं है कि आपके मामले में या तो समझ में आता है।

+0

आपका समाधान केवल तभी मान्य होगा जब यह वेब परत के भीतर प्रबंधित किया गया हो। चूंकि यह ईजेबी बीन है क्योंकि यह सीडीआई कार्यान्वयन के अंदर एक बग है। – iku

+0

मैं इस से सहमत नहीं हूं। स्टेपिंग स्टेटलेस यहां कोई समझ नहीं आता है और मुझे लगता है कि यह भी काम नहीं करेगा। केवल स्टेटफुल बीन्स में स्कॉप्स हो सकते हैं। तथ्य यह है कि सीडीआई को 'स्टेटलेस' की घटना के लिए वास्तव में एक ठोस जवाब नहीं मिला है। एक स्टेटलेस बीन एक नियमित बीन की तुलना में संदेशों को सुनकर एक एंडपॉइंट की तरह है। यही कारण है कि स्वयं इंजेक्शन और परिपत्र निर्भरता कोई समस्या नहीं है। एक स्टेटलेस प्रॉक्सी एक यूआरएल की तरह अधिक है। जब कोई विधि कॉल होता है, तो वह उस प्रकार के किसी भी बीन को भेजता है (एक नया उदाहरण, पूल से एक, हमेशा एक ही ...)। तो स्कोप्ड का अनुरोध यहां पूरी तरह से गलत होगा। –

1

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

कोड है कि सर्कुलर निर्भरता अपवाद का कारण:

class A{ 
    @Inject B b; 
    public void foo(){ 
     b.bar(); 
    } 
    public void quux(){ 
     //some code 
    } 
} 
class B{ 
    @Inject A a; 
    public void bar(){ 
     //some code 
    } 
    public void baz(){ 
     a.quux(); 
    } 
} 

एक समाधान इस मुद्दे को हल करने के लिए javax.enterprise.inject.Instance

class A{ 
    @Inject B b; 
    public void foo(){ 
     b.bar(); 
    } 
    public void quux(){ 
     //some code 
    } 
} 
class B{ 
    @Inject Instance<A> a; 
    public void bar(){ 
     //some code 
    } 
    public void baz(){ 
     a.get().quux(); 
    } 
} 
संबंधित मुद्दे