2013-11-15 98 views
6

我的目标是从JSF2 ExceptionHandlerWrapper中获取所有在用CDI托管的bean(某个父类的集合)的集合。请注意,异常处理程序部分非常重要,因为该类本身不是有效的注入目标。所以我的假设(也许不正确)是我唯一的路线是通过BeanManager编程的。获取在服务CDI托管的bean

使用BeanManager.getBeans,我可以成功获取所有可用于注入的bean的集合。我的问题是,当使用BeanManager.getReference获取bean的上下文实例时,如果bean尚不存在,它将被创建。所以我正在寻找一种只会返回实例化bean的替代方法。下面的代码是我的出发点

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这对于bean实例一个get()方法的两个版本的Javadoc戳。其中一个在传递创建上下文时,具有与BeanManager.getReference()相同的行为。然而另一个只需要一个Bean引用并返回上下文实例(如果可用)或者返回null。

利用,这里是只返回初始化bean原方法的版本:

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