2011-11-17 15 views
12

क्या मैं (और यदि ऐसा है, कैसे?) लुकअप सीडीआई ईजेबी मॉड्यूल में javax.naming.Context#lookup का उपयोग कर प्रबंधित बीन्स?क्या मैं (और कैसे) देख सकता हूं सीडीआई प्रबंधित बीन्स javax.naming.Context # ईजेबी मॉड्यूल में लुकअप?

मैं ग्लासफ़िश v3 का उपयोग कर रहा हूं। मुझे लगता है कि मैं @Named का उपयोग कर सकता हूं, लेकिन सीडीआई प्रबंधित बीन का जेएनडीआई नाम क्या है? मैं उन्हें अप्रबंधित पीओजेओ से देखना चाहता हूं इसलिए मैं @Inject का उपयोग नहीं कर सकता।

उत्तर

6

आप जेएनडीआई (java:comp/BeanManager) के माध्यम से BeanManager देख सकते हैं तो एक प्रबंधित बीन के संदर्भ संदर्भ प्राप्त करने के लिए BeanManager के जेएसआर -29 9 एपीआई को लटका दिया गया है।

जेएसआर -29 9 प्रबंधित बीन्स सीधे जेएनडीआई लुकअप के लिए उपलब्ध नहीं हैं।

+3

मुझे http://dominikdorn.com/2010/04/cdi-weld-manual-bean-lookup/ – Sebi

+0

पर एक अच्छा कोड उदाहरण मिला, एक नाम @ManagedBean (value = "MyManagedBean") POJO को JNDI के माध्यम से देखा जा सकता है यानी InitialContext.doLookup ("जावा: ऐप/मैप/माईमैनेज्डबीन") के साथ; javax.annotation का एपीआई दस्तावेज़ देखें। प्रबंधित बीन –

+0

मैं उत्सुक था कि 'javax.annotation.ManagedBean' वास्तव में क्या है, यहां एक अच्छा जवाब है: http://stackoverflow.com/a/32420123/1341535 –

16

आप CDI.current() का उपयोग करके BeanManager तक भी पहुंच सकते हैं, जो आपको कोड की अच्छी कुछ पंक्तियों को टाइप करने से बचाता है। उदाहरण here

CDI.current का उपयोग करना()

BeanManager bm = CDI.current().getBeanManager(); 

से लिया JNDI का उपयोग करना:

BeanManager bm = null; 
try { 
    InitialContext context = new InitialContext(); 
    bm = (BeanManager) context.lookup("java:comp/BeanManager"); 
} catch (Exception e) { 
    e.printStackTrace(); 
} 

अब आप BeanManager आप या तो एक प्रकार के आधार पर देखने कार्य करके अपना CDI सेम का उपयोग कर सकते है या एक नाम-आधारित लुकअप।

प्रकार आधारित:

Bean<CrudService> bean = (Bean<CrudService>) bm.getBeans(CrudService.class).iterator().next(); 
CreationalContext<CrudService> ctx = bm.createCreationalContext(bean); 
CrudService crudService = (CrudService) bm.getReference(bean, CrudService.class, ctx); 

नाम आधारित

Bean bean = bm.getBeans("crudService").iterator().next(); 
CreationalContext ctx = bm.createCreationalContext(bean); 
CrudService crudService = bm.getReference(bean, bean.getClass(), ctx); 

पूर्ण उदाहरण:

//get reference to BeanManager 
BeanManager bm = CDI.current().getBeanManager(); 
Bean<CrudService> bean = (Bean<CrudService>) bm.getBeans(CrudService.class).iterator().next(); 
CreationalContext<CrudService> ctx = bm.createCreationalContext(bean); 

//get reference to your CDI managed bean 
CrudService crudService = (CrudService) bm.getReference(bean, CrudService.class, ctx); 

अद्यतन - आप CDI 1.1 उपयोग कर रहे हैं यह अब एक पंक्ति में प्राप्त किया जा सकता :

CrudService crudService = CDI.current().select(CrudService.class).get(); 
+5

मेरे मामले में मुझे WELD-001305 अपवाद से बचने के लिए 'bean.getClass()' के बजाय 'bean.getBeanClass()' का उपयोग करना पड़ा। –

+3

आप CDI.current() कर सकते हैं। सीडीआई 1.1+ – ravthiru

+0

के साथ (CrudService.class) .get() का चयन करें CDI.current() का उपयोग करते समय मैं प्रमाणीकरण प्रमाण-पत्र कैसे पास करूं? InitialContext() का उपयोग करते समय मैं निर्माता गुणों में प्रधानाचार्य निर्दिष्ट कर सकता हूं। मैं CDI.current() के बराबर कुछ कैसे करूं? –

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