私の目標は、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;
}