2013-11-15 17 views
6

Amacım, bir JSF2 ExceptionHandlerWrapper içinden tüm hizmet içi CDI yönetilen çekirdeklerinin (belirli bir üst sınıfın) bir koleksiyonunu elde etmektir. Özel durum işleyici bölümünün, sınıfın geçerli bir enjeksiyon hedefi olmadığı için önemli olduğunu unutmayın. Bu yüzden benim varsayımım (belki de yanlış) tek yolumun BeanManager aracılığıyla programlı olması.Yalnızca hizmet içi CDI tarafından yönetilen fasulye alın

BeanManager.getBeans'i kullanarak, tüm çekirdeklerin enjeksiyon için kullanılabilir kümesini başarıyla edinebilirim. Sorunum, BeanManager.getReference ürününün fasülyenin somut örneğini elde etmek için kullanıldığı zaman, zaten mevcut değilse, çekirdeğin oluşturulacağıdır. Bu yüzden sadece çıkarılan fasulyeleri geri getirecek bir alternatif arıyorum. Aşağıdaki kod ben fasulye örnekleri için bir get() metodunun iki sürümü vardır Context bulundu javadoc ile alay ... biz İşte benim başlangıç ​​noktası

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; 
} 

cevap

7

olduğunu. Bunlardan biri, yaratıcı bir bağlamda geçerken, BeanManager.getReference() ile aynı davranışa sahiptir. Ancak diğeri sadece bir Bean referansı alır ve bağlamsal örneği (varsa) veya başka bir değeri döndürür.

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; 
} 
: O yararlanan

, burada sadece örneği fasulye döndüren orijinal yöntemin versiyonu

İlgili konular