5

मैं JBoss में एक वेल्ड कंटेनर में CDI इंजेक्शन के साथ एक मुद्दे में चल रहा हूँ 7.1.1CDI इंजेक्शन पाश

मैं निम्नलिखित ऑब्जेक्ट मॉडल मिल गया है:

@Stateless 
class ServiceEjb { 
@Inject 
A a; 
} 

class A { 
@Inject 
B b; 
} 

class B { 
@Inject 
A a; 
} 

जब एक इंजेक्षन करने की कोशिश कर या बी मेरे स्टेटलेस क्लास, इंजेक्शन लूप और क्रैश में javax.enterprise.inject.CreationException के साथ।

मैं कई चीजों की कोशिश करता हूं (स्कॉइंग, @ एंग बी पर @ सिंगलेटन लेकिन सफलता के बिना)। मैं कोड तोड़ना नहीं चाहता, और उन इंजेक्शन इंद्रियां बनाता है।

किसी भी सुराग की सराहना की जाएगी।

उत्तर

10

Circular dependency injection is not required by the CDI standard, जब तक कि चक्र में कम से कम एक बीन normal scope न हो। इसका सबसे आसान समाधान ए या बी को सामान्य दायरा देना है। यदि आप या तो सामान्य दायरा नहीं दे सकते हैं (कोड मॉक-अप से, ऐसा लगता है कि उनके पास डिफ़ॉल्ट @Dependent छद्म-स्कोप है), आपको अन्य समाधानों को देखना होगा। एक वास्तविक कोड नमूना पोस्ट करने से हम आपको किसी विशेष समाधान के साथ मदद कर सकते हैं, लेकिन यहां एक शुरुआत है:

  • क्या ए और बी को उसी कक्षा में जोड़ा जा सकता है?
  • क्या एक नई कक्षा, सी, ए और बी से निकाली जा सकती है, ताकि एक दूसरे के बजाय ए और बी @Inject सी दोनों हो?

यहाँ कुछ अतः अन्य समाधान के साथ लिंक है कि आप उपयोगी हो सकते हैं:

MVP with CDI; avoiding circular dependency

https://stackoverflow.com/questions/14044538/how-to-avoid-cdi-circular-dependency

+0

धन्यवाद के इंजेक्षन चाहिए (और/या उदाहरण < एक के बजाय एक >)। मुझे यह मानना ​​है कि सामान्य दायरे की अवधारणा मेरे लिए बहुत स्पष्ट नहीं है। आपके द्वारा प्रदान किए गए लिंक @NormalScope के बारे में बोलते हैं लेकिन यह अस्तित्व में नहीं है। एक सामान्य दायरे कैसे घोषित करें? – jmcollin92

+0

[अधिकांश स्कॉप्स सामान्य स्कॉप्स हैं।] (Http://docs.jboss.org/cdi/spec/1.0/html/contexts.html#normalscope) सत्र, एप्लिकेशन, वार्तालाप, और अनुरोध स्कोप सामान्य स्कॉप्स हैं। यह _pseudoscopes_ के विपरीत है: सिंगलटन और आश्रित (जो डिफ़ॉल्ट है जब आप स्कोप एनोटेशन में नहीं लिखते हैं)। – Nick

+0

इसलिए, क्योंकि मैं पहले से ही दायरे घोषित करने का प्रयास करता हूं, अगर मैं अच्छी तरह से समझता हूं, तो यह काम करना चाहिए। मैं एक डीएओ (सत्र सत्र द्वारा उपयोग) के लिए किस प्रकार का दायरा कोशिश कर सकता हूं? – jmcollin92

4

मैं javax.inject.Provider स्पष्ट रूप से का उपयोग करके समस्या को हल किया। हालांकि मुझे लगता है कि यह स्वचालित रूप से डब्लूडब्लूडीडी द्वारा हुड के तहत किया जाना चाहिए, यह मेरे लिए भी मामला नहीं था। यह मेरे लिए काम किया और मेरी संबंधित समस्या हल हो गई।

class A { 
    @Inject 
    Provider<B> b; // access with b.get() 
} 

class B { 
    @Inject 
    Provider<A> a; // access with a.get() 
} 

मैं इसे परीक्षण नहीं किया है, लेकिन यह चक्र को तोड़ने के एक प्रदाता का उपयोग करने के लिए पर्याप्त हो सकता है, यानी आप दोनों वर्गों में इसका इस्तेमाल करने की जरूरत नहीं है।

1

आप अपने त्वरित जवाब के लिए एक उदाहरण < बी > के बजाय बी