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();