मेरे पास दो प्रकार की रिपॉजिटरीज़ प्रबंधित करने के लिए निम्न कोड है। दोनों भंडार वर्गों को अपने संसाधनों के पुनर्मूल्यांकन की अनुमति देने के लिए एक इंटरफ़ेस प्राप्त होता है।प्रकार के लिए असंतुष्ट निर्भरता [...] इंजेक्शन बिंदु पर क्वालीफायर [@ डीफॉल्ट] के साथ (सीडीआई के साथ @ स्टेटेट ईजीबी का उपयोग करके)
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
साथ संयोजन के रूप में काम करता है वर घोषणा में इंटरफ़ेस का उपयोग करने के लिए है।
क्यू के:
- की उम्मीद क्यों नहीं इस काम के रूप में?
UserRepository
var को पहले से ही किस कक्षा को तत्काल पहचानने की पहचान करनी चाहिए, है ना? इसका तर्क क्या है? @Stateful
ईजेबी एनोटेशन का इतना गंभीर प्रभाव क्यों है? यह अनिवार्य रूप से मुझे विभिन्न घोषणाओं मेंCachingRepository
इंटरफ़ेस का उपयोग करने के लिए मजबूर क्यों करता है?
नोट, मैं सीवन का उपयोग कर '3 @ViewScoped
बन एक CDI दृश्य-दायरे वाले सेम बनाने चेहरे, तो हाथ में समस्या होने की संभावना अभी भी CDI-केवल है।
ओह, और बीटीडब्लू ऐसा लगता है कि यहां कुछ डिग्री पहले उत्तर दिया गया है http://stackoverflow.com/questions/9038815/weld-001408- संतुष्ट- निर्भरता- जब- इंजेक्शन- ejbs-that-implement-interfac, लेकिन क्यों "यदि आप ईजेबी का उपयोग करते हैं तो आप अब कार्यान्वयन का उपयोग नहीं कर सकते"? इसके पीछे तर्क क्या है? अब और क्यों संभव नहीं है? यह सम्मेलन मौजूद है, लेकिन यह बिल्कुल क्यों है? – Kawu
जैसा कि मैंने लिखा है, मुझे यह कोई समझ नहीं आता है और मुझे खुशी है कि अब यह संभव नहीं है इसलिए मैं इसके साथ मदद नहीं कर सकता-) –
क्या आप जानते हैं कि आपको '@ नामांकित' की आवश्यकता है और केवल तभी एक सीडीआई प्रबंधित बीन के लिए जेएसएफ-पहुंच? यह सब एक योग्य ईएल-नाम प्रदान कर रहा है, यह ** ** ** एक सीडीआई प्रबंधित बीन (जिसे beans.xml द्वारा किया जाता है) के लिए एक pojo बनाते हैं ... –