2011-11-17 49 views

回答

6

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

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

+3

我在http://dominikdorn.com/2010/04/cdi-weld-manual-bean-lookup/ – Sebi

+0

找到了一个很好的代码示例一个名为@ManagedBean(value =“MyManagedBean”)的POJO可以通过JNDI查找与即InitialContext.doLookup(“java:app/myapp/MyManagedBean”);请参阅javax.annotation.ManagedBean的API文档 –

+0

我对“javax.annotation.ManagedBean”究竟是什么感到好奇,下面是一个很好的答案:http://stackoverflow.com/a/32420123/1341535 –

16

您还可以通过使用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(); 
+5

在我的情况下,我不得不使用'bean.getBeanClass()'而不是'bean.getClass()'来避免WELD-001305异常。 –

+3

您可以使用CDI 1.1+执行CDI.current()。select(CrudService.class).get()1.1+ – ravthiru

+0

如何在使用CDI.current()时传递身份验证凭据?当使用InitialContext()时,我可以在构造函数属性中指定Principal。我如何做一些与CDI.current()相当的东西? –

相关问题