我可以(如果是这样,怎么样?)在EJB模块中使用javax.naming.Context#lookup
来查找CDI托管的bean?我可以(以及如何)在EJB模块中使用javax.naming.Context#lookup查找CDI托管bean吗?
我正在使用GlassFish v3。我想我可以使用@Named
,但什么是CDI托管bean的JNDI名称?我想从非托管POJO中查找它们,所以我不能使用@Inject
。
我可以(如果是这样,怎么样?)在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,这可以节省您输入很少几行代码的空间。从here
使用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<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();
在我的情况下,我不得不使用'bean.getBeanClass()'而不是'bean.getClass()'来避免WELD-001305异常。 –
您可以使用CDI 1.1+执行CDI.current()。select(CrudService.class).get()1.1+ – ravthiru
如何在使用CDI.current()时传递身份验证凭据?当使用InitialContext()时,我可以在构造函数属性中指定Principal。我如何做一些与CDI.current()相当的东西? –
我在http://dominikdorn.com/2010/04/cdi-weld-manual-bean-lookup/ – Sebi
找到了一个很好的代码示例一个名为@ManagedBean(value =“MyManagedBean”)的POJO可以通过JNDI查找与即InitialContext.doLookup(“java:app/myapp/MyManagedBean”);请参阅javax.annotation.ManagedBean的API文档 –
我对“javax.annotation.ManagedBean”究竟是什么感到好奇,下面是一个很好的答案:http://stackoverflow.com/a/32420123/1341535 –