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

zac*_*usz 16 java ejb glassfish cdi ejb-3.1

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

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

Chr*_*hie 30

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

使用CDI.current()

BeanManager bm = CDI.current().getBeanManager();
Run Code Online (Sandbox Code Playgroud)

使用JNDI:

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

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

基于类型:

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);
Run Code Online (Sandbox Code Playgroud)

基于名称的

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

完整示例:

//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);
Run Code Online (Sandbox Code Playgroud)

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

CrudService crudService = CDI.current().select(CrudService.class).get();
Run Code Online (Sandbox Code Playgroud)

  • 在我的情况下,我不得不使用`bean.getBeanClass()`而不是`bean.getClass()`来避免WELD-001305异常. (6认同)
  • 您可以使用CDI 1.1+执行CDI.current().select(CrudService.class).get() (6认同)

cov*_*ner 6

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

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

  • 我在http://dominikdorn.com/2010/04/cdi-weld-manual-bean-lookup/找到了一个很好的代码示例 (3认同)