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