2012-01-27 10 views
11

यहां स्थिति है।WELD-001408 इंटरफेस लागू करने वाले ईजेबी इंजेक्शन करते समय असंतुष्ट निर्भरता

मैंने मिला निम्नलिखित इंटरफेस:

public interface Parent { } 
public interface ChildOne extends Parent { } 
public interface ChildTwo extends Parent { } 

और 2 EJBs:

@Stateless 
public class FirstBean implements ChildOne { } 

@Stateless 
public class SecondBean implements ChildTwo { } 

और यह भी इस CDI बीन:

@Named 
@SessionScoped 
public class TestController implements Serializable { 

    @Inject 
    private FirstBean firstBean; 

    @Inject 
    private SecondBean secondBean; 
} 

इस तैनात करने के लिए प्रयास करते समय ग्लासफ़िश 3.1 पर मुझे निम्नलिखित अपवाद मिलता है:

Exception while loading the app : WELD-001408 Unsatisfied dependencies for type [FirstBean] 
with qualifiers [@Default] at injection point [[field] @Inject private com.test.controllers.TestController.firstBean] 
org.jboss.weld.exceptions.DeploymentException: WELD-001408 Unsatisfied dependencies for type [FirstBean] 
with qualifiers [@Default] at injection point [[field] @Inject private com.test.controllers.TestController.firstBean] 
    at org.jboss.weld.bootstrap.Validator.validateInjectionPoint(Validator.java:305) 

जब दोनों ईजेबी Parent इंटरफ़ेस को लागू करते हैं, तो अपवाद समान होता है।
इसके अलावा, मैंने क्वालीफायर जोड़ने की कोशिश की, लेकिन इससे कुछ भी नहीं बदला।

उत्तर

20

मैं सिर्फ अपने निर्माण के साथ चारों ओर खेला जाता है, वेल्ड docu का एक सा पढ़ सकते हैं और निम्नलिखित में पता चला।

आप ईजेबी का उपयोग कर रहे हैं जो एक इंटरफ़ेस को कार्यान्वित करते हैं, इसलिए नो-इंटरफ़ेस दृश्य अब और संभव नहीं है (लेकिन स्पष्ट रूप से), लेकिन आप सीधे कार्यान्वयन तक पहुंचने का प्रयास कर रहे हैं। जैसे ही आप इसे ईजेबी के रूप में घोषित करते हैं, आपको सम्मेलनों को ध्यान में रखना होगा। इसलिए, यदि आप एक इंटरफेस को परिभाषित करते हैं तो आपको ईजेबी तक पहुंच प्राप्त करने के लिए इसका उपयोग करना होगा। निम्नलिखित करने के लिए इसे बदलने, बाहर काम करना चाहिए:

@Inject 
private ChildOne firstBean; 

कार्यान्वयन भले ही एक अंतरफलक परिभाषित किया गया है को एक्सेस करना सादा CDI प्रबंधित बीन्स के लिए सिर्फ संभव है (@ स्टेटफुल एनोटेशन बिना @ स्टेटलेस/वर्ग)। तो अपनी एनोटेशन से छुटकारा पाएं और यह काम करेगा।

बस अपनी जानकारी के लिए, यदि आप ग्लासफ़िश का उपयोग कर रहे हैं। यदि आप अपने ईजेबी से चिपके रहते हैं और पैरेंट इंटरफेस विधि तक पहुंचने का प्रयास करते हैं तो आप this बग/अपवाद में भाग लेंगे।

+0

धन्यवाद एक टन! वास्तव में अच्छी व्याख्या! और मैं पहले से ही उस अपवाद में फंस गया हूं 'ejb के लिए ejbRef को परिवर्तित करने में असमर्थ ...', मुझे नहीं पता था कि यह एक ज्ञात मुद्दा है। – jFrenetic

+0

मैंने इसे एक बार फिर से चेक किया। मैंने सुझाव दिया कि इंटरफ़ेस संदर्भ द्वारा उन ईजेबी को इंजेक्ट करने का प्रयास किया।और मुझे अभी भी तैनाती के दौरान यह 'असंतुष्ट निर्भरता ...' अपवाद मिल रहा है। मैंने @ लोकाल के साथ इंटरफेस को भी टिप्पणी की। फिर भी यह काम नहीं करता है। – jFrenetic

+0

मैं कल इसे बाहर की कोशिश की और यह मेरे लिए काम किया है, इसके अलावा यह काफी भावना का एक सा बना देता है। वैसे भी, जब मैं घर वापस आऊंगा तो मैं इसे फिर से कोशिश करूंगा। –

0

क्या आपने @EJB एनोटेशन का उपयोग करने की कोशिश की है, फिर सीडीआई @ इंजेक्ट एनोटेशन?

उदा।

@Named 
@SessionScoped 
public class TestController implements Serializable { 

    @EJB 
    private FirstBean firstBean; 

    @EJB 
    private SecondBean secondBean; 
} 
+0

नहीं, मैं नहीं की है। विचार के लिए धन्यवाद, लेकिन मैं वास्तव में समझना चाहता हूं कि मैं यहां क्या कर रहा हूं। – jFrenetic

+0

क्या आपके पास मेटा-आईएनएफ में बीन्स.एक्सएमएल है? –

+0

मुझे यकीन है कि। अगर मेरे पास यह नहीं था, तो डब्लूएलईडी मेरे सीडीआई सेम का पता नहीं लगाएगा और तैनाती के दौरान सत्यापन नहीं करेगा। – jFrenetic

6

बेहतर कभी नहीं से देर से:

7.1.1 के रूप में JBoss के साथ मेरे लिए @LocalBean काम करता है के साथ aditionally SLSB टिप्पणी करना। मुझे कोई अतिरिक्त मूल्य के लिए इंटरफ़ेस बनाने का विचार पसंद नहीं है।

अपने उदाहरण का उपयोग करना:

@Stateless 
@LocalBean 
public class FirstBean implements ChildOne { } 

@Stateless 
@LocalBean 
public class SecondBean implements ChildTwo { } 
+0

@atamanroman , क्या आप जानते हैं कि वह विधि पोर्टेबल है? क्योंकि के लिए '@ LocalBean' परिभाषा है" निर्दिष्ट करता है कि एक ** सत्र ** सेम नो इंटरफ़ेस दृश्य को उजागर करता है "और यह एक" सत्र "सेम यहाँ नहीं है के रूप में, यह हर जगह काम करेगा और यह करने के लिए सही बात है? –

+1

@ एंथनीओ। स्टेटलेस सत्र सेम और स्टेटफुल सत्र बीन्स दोनों सत्र बीन्स हैं। तो हाँ, यह बिल्कुल मानक की आवश्यकता है। – atamanroman

+0

यह जेबॉस 6.1.0 के लिए भी काम करता है – Ste

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