2012-04-27 11 views
11

मेरे पास दो प्रकार की रिपॉजिटरीज़ प्रबंधित करने के लिए निम्न कोड है। दोनों भंडार वर्गों को अपने संसाधनों के पुनर्मूल्यांकन की अनुमति देने के लिए एक इंटरफ़ेस प्राप्त होता है।प्रकार के लिए असंतुष्ट निर्भरता [...] इंजेक्शन बिंदु पर क्वालीफायर [@ डीफॉल्ट] के साथ (सीडीआई के साथ @ स्टेटेट ईजीबी का उपयोग करके)

public interface CachingRepository 
{ 
    public void invalidateCache(); 
} 

ग्लोबल, आवेदन-दायरे वाले रेपो:

@Named("globalRepo") 
@ApplicationScoped 
public class GlobalRepository implements CachingRepository 
{ 
    private List<Category> categories; 

    ... 

    @Override 
    public void invalidateCache() 
    { 
     categories = null; 
    } 

    ... 
} 

प्रति उपयोगकर्ता, सत्र-दायरे रेपो:

@Named("userRepo") 
@SessionScoped 
//@Stateful   // <- NOTE HERE 
public class UserRepository implements CachingRepository, Serializable 
{ 
    private List<MyFile> files; 

    @Override 
    public void invalidateCache() 
    { 
     files = null; 
    } 

    ... 
} 

जब यह इंजेक्शन लगाने (@Stateful के बिना) संदर्भ

@Named 
@ViewScoped 
public class MyHandler implements Serializable 
{ 
    @Inject 
    private UserRepository userRepo; 

    ... 
} 
में

यह काम करता है। हालांकि, जब UserRepository वर्ग के लिए @Stateful जोड़ने, तैनाती एक अपवाद कहावत के साथ विफल:

Caused by: org.jboss.weld.exceptions.DeploymentException: WELD-001408 Unsatisfied dependencies for type [UserRepository] with qualifiers [@Default] at injection point [[field] @Inject private de.company.project.pack.MyHandler.userRepo] 
    at org.jboss.weld.bootstrap.Validator.validateInjectionPoint(Validator.java:275) 
    at org.jboss.weld.bootstrap.Validator.validateInjectionPoint(Validator.java:244) 
    at org.jboss.weld.bootstrap.Validator.validateBean(Validator.java:107) 
    at org.jboss.weld.bootstrap.Validator.validateRIBean(Validator.java:127) 
    at org.jboss.weld.bootstrap.Validator.validateBeans(Validator.java:346) 
    at org.jboss.weld.bootstrap.Validator.validateDeployment(Validator.java:331) 
    at org.jboss.weld.bootstrap.WeldBootstrap.validateBeans(WeldBootstrap.java:366) 
    at org.jboss.as.weld.WeldContainer.start(WeldContainer.java:83) 
    at org.jboss.as.weld.services.WeldService.start(WeldService.java:76) 
    ... 5 more 

तरह

@Inject @Named("userRepo") 
private UserRepository userRepo; 

परिणाम एक ही अपवाद में CDI सेम के नाम जोड़ने से।

@Inject @Named("userRepo") 
private CachingRepository userRepo; 

मैं हालांकि उप वर्ग कार्यक्षमता यहाँ की जरूरत हो सकती है, इसलिए CachingRepository का उपयोग कर वास्तव में (इस समय) वांछित नहीं है: केवल बात यह है कि @Stateful साथ संयोजन के रूप में काम करता है वर घोषणा में इंटरफ़ेस का उपयोग करने के लिए है।

क्यू के:

  1. की उम्मीद क्यों नहीं इस काम के रूप में? UserRepository var को पहले से ही किस कक्षा को तत्काल पहचानने की पहचान करनी चाहिए, है ना? इसका तर्क क्या है?
  2. @Stateful ईजेबी एनोटेशन का इतना गंभीर प्रभाव क्यों है? यह अनिवार्य रूप से मुझे विभिन्न घोषणाओं में CachingRepository इंटरफ़ेस का उपयोग करने के लिए मजबूर क्यों करता है?

नोट, मैं सीवन का उपयोग कर '3 @ViewScoped बन एक CDI दृश्य-दायरे वाले सेम बनाने चेहरे, तो हाथ में समस्या होने की संभावना अभी भी CDI-केवल है।

+0

ओह, और बीटीडब्लू ऐसा लगता है कि यहां कुछ डिग्री पहले उत्तर दिया गया है http://stackoverflow.com/questions/9038815/weld-001408- संतुष्ट- निर्भरता- जब- इंजेक्शन- ejbs-that-implement-interfac, लेकिन क्यों "यदि आप ईजेबी का उपयोग करते हैं तो आप अब कार्यान्वयन का उपयोग नहीं कर सकते"? इसके पीछे तर्क क्या है? अब और क्यों संभव नहीं है? यह सम्मेलन मौजूद है, लेकिन यह बिल्कुल क्यों है? – Kawu

+0

जैसा कि मैंने लिखा है, मुझे यह कोई समझ नहीं आता है और मुझे खुशी है कि अब यह संभव नहीं है इसलिए मैं इसके साथ मदद नहीं कर सकता-) –

+0

क्या आप जानते हैं कि आपको '@ नामांकित' की आवश्यकता है और केवल तभी एक सीडीआई प्रबंधित बीन के लिए जेएसएफ-पहुंच? यह सब एक योग्य ईएल-नाम प्रदान कर रहा है, यह ** ** ** एक सीडीआई प्रबंधित बीन (जिसे beans.xml द्वारा किया जाता है) के लिए एक pojo बनाते हैं ... –

उत्तर

9

मैं इस भ्रामक अपवाद के साथ एक ही समस्या थी ...

@StatefulUserRepository करने के लिए आप एक नहीं इंटरफ़ेस दृश्य घोषित बिना CachingRepository इंटरफ़ेस का EJB तरीकों का पर्दाफाश जोड़ कर। नो-इंटरफ़ेस दृश्य को सक्रिय करने के लिए @LocalBean से UserRepository जोड़ें। EJB 3.1 विशिष्टता, धारा 4.9.8 "सत्र बीन की नो-इंटरफ़ेस देखें"

सेम वर्ग को नामित करना होगा कि वह अपने सेम वर्ग परिभाषा के माध्यम से या तैनाती डिस्क्रिप्टर में नो-इंटरफेस दृश्य को उजागर करता है देखें।निम्नलिखित नियम लागू होते हैं: सेम कम से कम एक अन्य ग्राहक दृश्य को उजागर करता है

  • ...
  • हैं, सेम निर्दिष्ट करता है कि उस पर @LocalBean एनोटेशन के माध्यम से नो-इंटरफेस दृश्य को उजागर करता है बीन कक्षा या तैनाती में वर्णनकर्ता।
  • ...

मैं भी कोई इंटरफ़ेस दृश्यों के बारे में अधिक जानकारी के लिए this stackoverflow जवाब को देखें।

+0

अच्छा, बस मुझे जो चाहिए, धन्यवाद! – Kawu

+1

मेरे पास कोई ईजेबी नहीं है। मैं अपने कोड में कहीं भी @Default एनोटेशन का उपयोग नहीं कर रहा हूं। लेकिन अभी भी वाइल्डफ्लाई स्टार्टअप के समय यह अपवाद फेंक रहा है। मैंने बहुत कुछ खोजा है लेकिन हर कोई ईजेबी के बारे में बात कर रहा है। – Sujoy

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