2012-04-17 12 views
13

मैं एक उपयोगकर्ता वस्तु के लिए एक @Producer विधि के साथ एक @SessionScoped @Named सेम है:CDI अस्पष्ट निर्भरता

@Named @SessionScoped 
public class UserBean implements Serializable 
{ 
    //... 
    @Named @Produces @LoggedIn @SessionScoped 
    public MyUser getCurrentUser() {return user;} 
} 

यह मेरा सेटअप में ठीक काम करता है (JBoss-7.1.1-अंतिम) और यह उपयोगकर्ता का उपयोग करने की कोई समस्या नहीं है #{currentUser.name} के साथ जेएसएफ पृष्ठों के फ़ील्ड। क्वालीफायर org.jboss.seam.security.annotations.LoggedIn है। अब मैं एक और @Named बीन में एक क्षेत्र में इस प्रयोक्ता @Inject हैं:

org.jboss.weld.exceptions.DeploymentException: 
WELD-001409 Ambiguous dependencies for type [MyUser] with qualifiers [@Default] at 
    injection point [[field] @Inject @LoggedIn test.FavBean.currentUser]. 
Possible dependencies [[Managed Bean [class test.ejb.MyUser] with qualifiers 
    [@Any @Default], 
Producer Method [MyUser] with qualifiers [@Any @Default] declared as [[method] 
    @Named @Produces @LoggedIn @SessionScoped public test.UserBean.getCurrentUser()]]] 

मुझे समझ नहीं आता पहले निर्भरता Managed Bean [class test.ejb.MyUser] इस वर्ग के एक सरल @Entity है:

@Named 
public class FavBean implements Serializable 
{ 
    private @Inject @LoggedIn MyUser currentUser; 
} 

यह मैं त्रुटि देता है और एक ईएआरबी में एक ebb.jar में तैनात। एक कामकाज के रूप में मैं वर्तमान में UserBean इंजेक्शन कर रहा हूं, वहां से उपयोगकर्ता को प्राप्त करें।

उत्तर

22

ऐसा इसलिए है क्योंकि सीडीआई प्रकार के अनुसार सेम के लिए खोज करता है और आपकी इकाई और निर्माता विधि उसी प्रकार लौटती है। यही कारण है कि यह संदिग्ध है।

आपको एक नया क्वालीफायर परिभाषित करने और इसे अपने निर्माता विधि के साथ एनोटेट करने की आवश्यकता है।

@Qualifier 
@Retention(RUNTIME) 
@Target({METHOD, FIELD, PARAMETER, TYPE}) 
public @interface CurrentUser { 
} 

अपने निर्माता विधि को यह टिप्पणी जोड़ें:

@Named @Produces @CurrentUser @LoggedIn @SessionScoped 
public MyUser getCurrentUser() {return user;} 
+1

या इसके लिए 'क्वालीफायर' जोड़कर 'लॉग इनइन एनोटेशन' को संशोधित करें। ऐसा लगता है कि इसमें 'क्वालीफायर' नहीं है। –

3

मैं बहुत समान समस्या थी, और मैं कुछ ऑफ़लाइन मदद मिली। मेरी समस्या यह थी कि मेरी सेवा कहां थी, इसे तैनात कान में और मेरी वेब प्रोजेक्ट में भी शामिल किया गया था। यह एक आकस्मिक नकल था, एक छोड़ दो, और यदि यह आपका मामला भी है तो यह काम करेगा।

निम्नलिखित तस्वीर पर मुझे esb_khr_web के अंदर esb_khr था, मैंने हटा दिया। ग्रहण में: गुणों और तैनाती असेंबली पर जाएं।

enter image description here

2

मैं एक विशेषज्ञ नहीं हूँ, लेकिन मैं एक ऐसी ही समस्या थी, और मैं, सरल तरीके से तय हो गई, @Alternative साथ सेम ही व्याख्या द्वारा ताकि निर्माता इष्ट है। हो सकता है कि मैं कुछ साइड इफेक्ट्स खो रहा हूं लेकिन यह तब तक काम करता था जब तक मैं देख सकता/आवश्यक था।

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