我可以(以及如何)使用EJB模块中的javax.naming.Context#lookup查找CDI托管bean吗?

我可以(如果是这样,如何?)在EJB模块中使用javax.naming.Context#lookup查找CDI托管bean?

我正在使用GlassFish v3。 我想我可以使用@Named ,但是什么是CDI托管bean的JNDI名称? 我想从非托管POJO中查找它们,所以我不能使用@Inject

您可以通过JNDI( java:comp/BeanManager )查找BeanManager ,然后使用挂起BeanManager的JSR-299 API来获取托管bean的上下文引用。

JSR-299托管bean不可用于直接JNDI查找。

您还可以使用CDI.current()访问BeanManager,这样可以节省您输入几行代码的麻烦。 从这里取的例子

使用CDI.current()

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

使用JNDI:

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

现在你有了BeanManager,你可以通过基于类型的查找或基于名称的查找来访问你的CDI bean。

基于类型:

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

基于名称的

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

完整示例:

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

更新 – 如果您使用CDI 1.1,现在可以在一行中实现:

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