2011-11-17 12 views

Respuesta

6

Puede buscar el BeanManager a través de JNDI (java:comp/BeanManager) y luego usar la API JSR-299 colgada del BeanManager para obtener una referencia contextual de un bean administrado.

Los beans administrados JSR-299 no están disponibles para la búsqueda directa de JNDI.

+3

Encontré un buen ejemplo de código en http://dominikdorn.com/2010/04/cdi-weld-manual-bean-lookup/ – Sebi

+0

Un nombre @ManagedBean (value = "MyManagedBean") POJO se puede buscar a través de JNDI con ie InitialContext.doLookup ("java: app/myapp/MyManagedBean"); ver API doc de javax.annotation.ManagedBean –

+0

Tenía curiosidad sobre qué es exactamente 'javax.annotation.ManagedBean', aquí hay una buena respuesta: http://stackoverflow.com/a/32420123/1341535 –

16

También puede acceder al BeanManager utilizando CDI.current(), lo que le permite escribir unas pocas líneas de código. Ejemplo tomado de here

Usando CDI.current()

BeanManager bm = CDI.current().getBeanManager(); 

Usando JNDI:

BeanManager bm = null; 
try { 
    InitialContext context = new InitialContext(); 
    bm = (BeanManager) context.lookup("java:comp/BeanManager"); 
} catch (Exception e) { 
    e.printStackTrace(); 
} 

Ahora usted tiene la BeanManager puede acceder a los granos de CDI por hacer ya sea una búsqueda basada en el tipo de o una búsqueda basada en el nombre.

Tipo basa:

Bean<CrudService> bean = (Bean<CrudService>) bm.getBeans(CrudService.class).iterator().next(); 
CreationalContext<CrudService> ctx = bm.createCreationalContext(bean); 
CrudService crudService = (CrudService) bm.getReference(bean, CrudService.class, ctx); 

basado en nombres

Bean bean = bm.getBeans("crudService").iterator().next(); 
CreationalContext ctx = bm.createCreationalContext(bean); 
CrudService crudService = bm.getReference(bean, bean.getClass(), ctx); 

ejemplo completo:

//get reference to BeanManager 
BeanManager bm = CDI.current().getBeanManager(); 
Bean<CrudService> bean = (Bean<CrudService>) bm.getBeans(CrudService.class).iterator().next(); 
CreationalContext<CrudService> ctx = bm.createCreationalContext(bean); 

//get reference to your CDI managed bean 
CrudService crudService = (CrudService) bm.getReference(bean, CrudService.class, ctx); 

ACTUALIZACIÓN - Esto ahora se puede lograr en una sola línea si está utilizando CDI 1.1 :

CrudService crudService = CDI.current().select(CrudService.class).get(); 
+5

En mi caso, tuve que usar 'bean.getBeanClass()' en lugar de 'bean.getClass()' para evitar la excepción WELD-001305. –

+3

Puede hacer CDI.current(). Select (CrudService.class) .get() con CDI 1.1+ – ravthiru

+0

¿Cómo paso las credenciales de autenticación cuando uso CDI.current()? Cuando uso InitialContext() puedo especificar el Principal en las propiedades del constructor. ¿Cómo hago algo equivalente con CDI.current()? –

Cuestiones relacionadas