Mein Ziel ist es, eine Sammlung aller CDI-verwalteten Beans im Betrieb (einer bestimmten Elternklasse) aus einem JSF2-ExceptionHandlerWrapper zu erhalten. Beachten Sie, dass der Exception-Handler-Teil von Bedeutung ist, da die Klasse selbst kein gültiges Injektionsziel ist. Meine Annahme (vielleicht inkorrekt) ist, dass meine einzige Route programmatisch durch BeanManager ist.Nur CDI-verwaltete Beans im Betrieb abrufen
Mit BeanManager.getBeans kann ich die Menge aller für die Injektion verfügbaren Beans erfolgreich erhalten. Mein Problem ist, dass wenn BeanManager.getReference verwendet wird, um die kontextabhängige Instanz der Bean zu erhalten, die Bean erstellt wird, wenn sie nicht bereits existiert. Also suche ich nach einer Alternative, die nur instanziierte Bohnen zurückgibt. Der folgende Code ist mein Ausgangspunkt
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;
}