gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 22:43:28 24 4
gpt4 key购买 nike

我能否(如果可以,如何?)在 EJB 模块中使用 javax.naming.Context#lookup 查找 CDI 管理的 bean?

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

最佳答案

您还可以使用 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。

基于类型:

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

关于java - 我可以(以及如何)在 EJB 模块中使用 javax.naming.Context#lookup 查找 CDI 管理的 bean 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8166187/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com