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

发布于 2024-12-16 01:16:46 字数 210 浏览 5 评论 0原文

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

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

Can I (and if so, how?) lookup CDI managed beans using javax.naming.Context#lookup in EJB module?

I'm using GlassFish v3. I suppose that I can use @Named, but what is JNDI name of CDI managed bean? I want to lookup them from unmanaged POJOs so I can't use @Inject.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

深白境迁sunset 2024-12-23 01:16:46

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

You can also access the BeanManager by using CDI.current(), which saves you typing a good few lines of code. Example taken from here

Using CDI.current()

BeanManager bm = CDI.current().getBeanManager();

Using JNDI:

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

Now you have the BeanManager you can access your CDI beans by doing either a type-based lookup or a name-based lookup.

Type based:

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

Name-based

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

Full example:

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

UPDATE - This can now be achieved in one line if you are using CDI 1.1:

CrudService crudService = CDI.current().select(CrudService.class).get();
划一舟意中人 2024-12-23 01:16:46

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

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

You can lookup the BeanManager via JNDI (java:comp/BeanManager) then use the JSR-299 API hung off of the BeanManager to get a contextual reference to a managed bean.

JSR-299 managed beans are not available for direct JNDI lookup.

风流物 2024-12-23 01:16:46

如果您正在开发 JSF / Jakarta Faces 项目并且正在使用 OmniFaces,您可以简单地执行以下操作:

MyBean myBean = org.omnifaces.util.Beans.getInstance("myBeanName");

另请参阅:

If you are working on a JSF / Jakarta Faces project and you're using OmniFaces, you can simply do:

MyBean myBean = org.omnifaces.util.Beans.getInstance("myBeanName");

See also:

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文