2013-11-15 5 views
6

मेरा लक्ष्य एक जेएसएफ 2 अपवाद हैडलरवापर के भीतर से सभी सेवा सीडीआई प्रबंधित बीन्स (एक निश्चित अभिभावक वर्ग के) का संग्रह प्राप्त करना है। ध्यान दें कि अपवाद हैंडलर भाग महत्वपूर्ण है क्योंकि कक्षा एक वैध इंजेक्शन लक्ष्य नहीं है। तो मेरी धारणा (शायद गलत) यह है कि मेरा एकमात्र मार्ग बीनमेनगर के माध्यम से प्रोग्रामेटिक है।केवल सेवा में सीडीआई प्रबंधित बीन्स

BeanManager.getBeans का उपयोग करके, मैं सफलतापूर्वक इंजेक्शन के लिए उपलब्ध सभी सेम का सेट प्राप्त कर सकता हूं। मेरी समस्या यह है कि बीनमेनर.getReference का उपयोग बीन के प्रासंगिक उदाहरण को प्राप्त करने के लिए करते समय, बीन बनाया जाएगा यदि यह पहले से मौजूद नहीं है। तो मैं एक विकल्प की तलाश में हूं जो केवल तत्काल बीन्स लौटाएगा। नीचे दिए गए कोड मेरी प्रारंभिक बिंदु

public List<Object> getAllWeldBeans() throws NamingException { 
    //Get the Weld BeanManager 
    InitialContext initialContext = new InitialContext(); 
    BeanManager bm = (BeanManager) initialContext.lookup("java:comp/BeanManager"); 

    //List all CDI Managed Beans and their EL-accessible name 
    Set<Bean<?>> beans = bm.getBeans(AbstractBean.class, new AnnotationLiteral<Any>() {}); 
    List<Object> beanInstances = new ArrayList<Object>(); 

    for (Bean bean : beans) { 
     CreationalContext cc = bm.createCreationalContext(bean); 
     //Instantiates bean if not already in-service (undesirable) 
     Object beanInstance = bm.getReference(bean, bean.getBeanClass(), cc); 
     beanInstances.add(beanInstance); 
    } 

    return beanInstances; 
} 

उत्तर

7

यहाँ हम कर रहे हैं ... जावाडोक मैं Context जो सेम उदाहरण के लिए एक get() विधि के दो संस्करण पाया के माध्यम से poking। उनमें से एक, जब एक रचनात्मक संदर्भ में गुजरता है, वही व्यवहार होता है जैसे BeanManager.getReference()। हालांकि दूसरा बस एक बीन संदर्भ लेता है और या तो प्रासंगिक उदाहरण (यदि उपलब्ध हो) देता है या फिर शून्य।

public List<Object> getAllCDIBeans() throws NamingException { 
    //Get the BeanManager via JNDI 
    InitialContext initialContext = new InitialContext(); 
    BeanManager bm = (BeanManager) initialContext.lookup("java:comp/BeanManager"); 

    //Get all CDI Managed Bean types 
    Set<Bean<?>> beans = bm.getBeans(Object.class, new AnnotationLiteral<Any>() {}); 
    List<Object> beanInstances = new ArrayList<Object>(); 

    for (Bean bean : beans) { 
     CreationalContext cc = bm.createCreationalContext(bean); 
     //Get a reference to the Context for the scope of the Bean 
     Context beanScopeContext = bm.getContext(bean.getScope()); 
     //Get a reference to the instantiated bean, or null if none exists 
     Object beanInstance = beanScopeContext.get(bean); 
     if(beanInstance != null){ 
      beanInstances.add(beanInstance); 
     } 
    } 

    return beanInstances; 
} 
:

कि फायदा उठाते हुए, यहां मूल विधि है जो केवल instantiated सेम रिटर्न का संस्करण है

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