jsf-2 - sessionscope - managed bean scope request</ managed bean scope
Obtenga solo frijoles administrados con CDI en servicio (1)
Mi objetivo es obtener una colección de todos los beans administrados CDI en servicio (de una cierta clase padre) dentro de un JSF2 ExceptionHandlerWrapper. Tenga en cuenta que la parte del manejador de excepciones es significativa porque la clase no es un objetivo de inyección válido en sí mismo. Así que mi suposición (tal vez incorrecta) es que mi única ruta es programática a través de BeanManager.
Usando BeanManager.getBeans, puedo obtener con éxito el conjunto de todos los beans disponibles para inyección. Mi problema es que al usar BeanManager.getReference para obtener la instancia contextual del bean, se creará el bean si aún no existe. Así que estoy buscando una alternativa que solo devuelva beans instanciados. El código a continuación es mi punto de partida
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;
}
Aquí estamos ... hurgando en el javadoc Encontré Contexto que tiene dos versiones de un método get () para instancias de beans. Uno de ellos, al pasar en un contexto creacional, tiene el mismo comportamiento que BeanManager.getReference (). Sin embargo, el otro solo toma una referencia de Bean y devuelve la instancia contextual (si está disponible) o de lo contrario nulo.
Aprovechando eso, aquí está la versión del método original que devuelve solo beans instanciados:
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;
}