Posso (e como) pesquisar beans gerenciados por CDI usando a consulta javax.naming.Context # no módulo EJB?

Posso (e, em caso afirmativo, como?) javax.naming.Context#lookup CDI gerenciado beans usando javax.naming.Context#lookup no módulo EJB?

Estou usando o GlassFish v3. Eu suponho que eu possa usar @Named , mas qual é o nome JNDI do bean gerenciado por CDI? Eu quero procurá-los em POJOs não gerenciados, então não posso usar @Inject .

Você pode procurar o BeanManager via JNDI ( java:comp/BeanManager ) e depois usar a API JSR-299 pendurada no BeanManager para obter uma referência contextual a um bean gerenciado.

Os beans gerenciados por JSR-299 não estão disponíveis para pesquisa direta de JNDI.

Você também pode acessar o BeanManager usando CDI.current (), o que economiza a digitação de algumas poucas linhas de código. Exemplo tirado daqui

Usando o CDI.current ()

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

Usando o JNDI:

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

Agora você tem o BeanManager que pode acessar seus beans CDI fazendo uma pesquisa baseada em tipo ou uma pesquisa baseada em nome.

Tipo baseado:

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

Baseado em nome

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

Exemplo completo:

 //get reference to BeanManager BeanManager bm = CDI.current().getBeanManager(); Bean bean = (Bean) bm.getBeans(CrudService.class).iterator().next(); CreationalContext ctx = bm.createCreationalContext(bean); //get reference to your CDI managed bean CrudService crudService = (CrudService) bm.getReference(bean, CrudService.class, ctx); 

ATUALIZAÇÃO – Isso agora pode ser alcançado em uma linha se você estiver usando o CDI 1.1:

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