2013-11-15 12 views
6

私の目標は、JSF2 ExceptionHandlerWrapper内から(特定の親クラスの)すべてのサービス中のCDIマネージドBeanのコレクションを取得することです。クラスが有効な注入ターゲットそのものではないため、例外ハンドラ部分は重要であることに注意してください。だから、私の前提(多分間違っている)は、私の唯一のルートはBeanManagerを通してプログラム的であるということです。サービス内のCDIマネージドBeanのみを取得する

BeanManager.getBeansを使用すると、注入に使用できるすべてのBeanのセットを正常に取得できます。私の問題は、Beanのコンテキストインスタンスを取得するためにBeanManager.getReferenceを使用する場合、Beanがまだ存在しない場合に作成されることです。だから私はインスタンス化された豆だけを返す代替を探しています。以下のコードは、私は、Beanインスタンスのget()メソッドの2つのバージョンを持っているContextを見つけたjavadocて突っつい...私たちはここに私の出発点

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

です。それらのうちの1つは、創造的なコンテキストで渡すとき、BeanManager.getReference()と同じ動作をします。しかし、もう一方はBean参照を取り、コンテキストインスタンス(使用可能な場合)またはnullを返します。

ここでの唯一のインスタンス化の豆を返す元のメソッドのバージョンである、ことを活かし:

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; 
} 
は、
関連する問題