我可以在 EJB 模块中使用 javax.nameing.Context#lookup(以及如何)查找 CDI 托管 Bean 吗?
我可以(如果是这样,如何?)在EJB模块中使用查找CDI托管Bean吗?javax.naming.Context#lookup
我正在使用GlassFish v3。我想我可以使用 ,但是CDI托管Bean的JNDI名称是什么?我想从非托管POJO中查找它们,因此我无法使用.@Named
@Inject
我可以(如果是这样,如何?)在EJB模块中使用查找CDI托管Bean吗?javax.naming.Context#lookup
我正在使用GlassFish v3。我想我可以使用 ,但是CDI托管Bean的JNDI名称是什么?我想从非托管POJO中查找它们,因此我无法使用.@Named
@Inject
您还可以使用 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<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);
基于名称
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<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);
更新 - 如果您使用的是 CDI 1.1,现在可以在一行中实现:
CrudService crudService = CDI.current().select(CrudService.class).get();
您可以查找 via JNDI (),然后使用 挂在 上的 JSR-299 API 来获取对受管 Bean 的上下文引用。BeanManager
java:comp/BeanManager
BeanManager
JSR-299 受管 Bean 不可用于直接 JNDI 查找。