问题标签 [cdi]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
5 回答
76582 浏览

jsf - 支持 bean (@ManagedBean) 还是 CDI Bean (@Named)?

我刚刚开始阅读Core JavaServer Faces,第 3 版。他们这样说(强调我的):

对于可以在 JSF 页面中使用的 bean,有两种独立的机制,CDI bean 和 JSF 管理的 bean,这是一个历史性的意外。我们建议您使用 CDI bean,除非您的应用程序必须在普通的 servlet 运行程序(如 Tomcat)上运行。

为什么?他们没有提供任何理由。我一直在使用@ManagedBeanGlassFish 3 上运行的原型应用程序中的所有 bean,但我并没有真正注意到任何问题。我不特别介意从@ManagedBeanto迁移@Named,但我想知道我为什么要打扰

0 投票
1 回答
348 浏览

java - 存在拦截器时 EJB 注入失败

在 JSF 应用程序中使用 DI 和拦截器时遇到问题。

我有一个支持 bean,它观察 JSF 事件并执行一些初始数据查找。在 JSF 页面中,bean 被注册为事件监听器,如下所示:

bean 非常前卫,看起来基本上是这样的:

道被正确注入,一切都很好,直到这里。现在我想执行一些在拦截器中完成的延迟加载(特定代码无关紧要,因为当拦截器仅在调用上下文上继续时会出现相同的行为)。因此,在调用 performSomeStuff() 之前,我想确保所有数据都已加载:

在这一点上,EJB 不再被注入(NPE 出现了......) - 对此有什么想法吗?

设置:

  • 玻璃鱼 3.0.1
  • 焊接-000900 1.0.1 (SP3)
  • Mojarra 2.0.2 (FCS b10)

提前致谢!

问候,亚历克斯

0 投票
2 回答
2866 浏览

jsf - 是否在会话范围的 JSF 支持 bean 中观察到 CDI 事件

我想知道是否可以使用多个 JSF 2.0 会话范围的支持 bean 观察 CDI 事件。我认为我可以通过观察事件将事件/数据推送到多个会话。

我设置了一个小测试,允许用户使用页面上的按钮触发事件(该按钮与实际触发事件的会话范围支持 bean 中的方法相关联)。我认为如果我打开两个不同的浏览器,将创建两个会话,并且该事件将通知每个会话范围的支持 bean。

但是,当运行我的小测试并单击按钮以在其中一个浏览器上触发事件时,我看到该事件仅通知会话范围 bean 之一。它只通知触发事件的 bean(即 - 如果我单击浏览器 1 中的按钮,则通知支持浏览器 1 中的会话的会话范围 bean,如果我单击浏览器 2 中的按钮,则支持会话的 bean浏览器 2 被通知)。

我的印象是事件会通知所有 bean 实例。然而,情况似乎并非如此。我应该能够做到这一点吗?我只是有什么设置错误吗?

更新以显示我的代码的样子:

jsfpage.xhtml 的片段,用于触发事件并显示会话范围的数据:

接收事件的 Session 范围的 bean:

一个应用程序范围的 bean 来触发事件:

0 投票
2 回答
1460 浏览

jsf-2 - 在 JSF 页面中重用同一类的多个 CDI @Named bean 实例

我想在 JSF2 页面中使用同一个 CDI 命名 bean 的多个实例。(想象一下,我有一个支持 bean 来访问 contentmanager 类别,但我想在同一个 JSF 页面中显示多个类别)我想知道如何“覆盖”@Named 注释的默认名称,以便我可以拥有这 3 o 4 个实例在我的页面中。(¿记住旧的 JSP“useBean”标签在页面中使用 bean...您可以通过这种方式使用同一类的多个实例)我搜索过 beans.xml,但没有找到。我可以使用旧 faces-context.xml“托管 bean”条目吗?不知道这是否适用于 CDI @Named bean 或只能用于旧的非 CDI 托管 bean。

感谢您提供任何信息,伊格纳西奥

0 投票
7 回答
86067 浏览

java - CDI 中的@ApplicationScoped 和@Singleton 范围有什么区别?

在 CDI 中有@ApplicationScoped和 ( javax.inject)@Singleton伪作用域。它们之间有什么区别?@ApplicationScoped除了被代理的事实,而@Singleton不是被代理的事实。

我可以把我的@Singleton豆子换成@ApplicationScoped吗?@ApplicationScopedbean 可以有两个(或更多)实例吗?

0 投票
2 回答
7015 浏览

jsf - CDI SessionScoped Bean 在同一会话中产生两个实例

对于同一个会话,我有两个 SessionScoped CDI bean 实例。我的印象是 CDI 会为我生成一个实例,但它生成了两个。我是否误解了 CDI 的工作原理,还是我发现了一个错误?

这是bean代码:

这是 Facelet 代码:

这是部署和导航到页面的输出:

使用 GlassFish 3.0.1

0 投票
0 回答
1514 浏览

redirect - CDI @Conversation 未通过 handleNavigation() 传播

handleNavigation()当我通过该方法重定向视图时,我遇到了长时间运行对话的传播问题。这是我的测试代码:

我有一个conversationscopedbean 和两个视图:

conversationStart.xhtml在浏览器中使用 URL 调用

http://localhost/tests/conversationStart.jsf?paramTestId=ParameterInUrl

参数被写入beanfield并正确显示在视图中。导航到下一个视图有 3 种不同的可能性。所有 3 工作正常。也显示beanfield下一个视图 ( conversationLogin.xhtml):

当我通过单击按钮返回起始页时,对话 bean 仍然包含所有值。所以一切都很好。这是豆:

现在问题来了!!

一旦我尝试在preRenderViewbean 的方法中重定向页面(只需取消注释方法中的代码),handleNavigation()就会在下一个视图中再次创建 bean,而不是使用已经创建的实例。虽然cid参数被传播到下一个视图!

有人知道出了什么问题吗?

最好的问候托马斯

0 投票
1 回答
1946 浏览

java-ee-6 - CDI 注入如何在 MDB 和 @Scheduled bean 中工作?

我正在开发一个部署在 JBoss 6 Final 上的大型 Java EE 6 应用程序。我当前的任务涉及始终使用@Inject 而不是@EJB,但是我在某些类型的bean 上遇到了一些问题,特别是@MessageDriven beans 和带有@Scheduled 方法的bean。

发生的情况是,如果我对时间不走运(对于@Schedule),或者如果在启动时 MDB 的队列中有消息,bean 的实例化将失败,因为注入的资源(它们本身是 EJB)尚未绑定.

因为我使用@Inject,所以我猜测EJB 容器认为我的bean 已经准备好了,因为容器本身并不关心@Inject;它可能只是假设由于没有@EJB 注入,bean 已准备好使用。然后,注入的 CDI 代理将失败,因为要注入的资源实际上尚未绑定。

小例子:

上面的示例可能不会经常失败,因为只有两个 bean,但是我正在处理的项目绑定了很多 EJB,这会放大问题。但它可能会失败,因为不能保证首先绑定 MySupportingBean,如果在绑定 MySupportingBean 之前调用 onTimeout,则 MyScheduledBean 的实例化将失败。如果我改用 @EJB,则在满足对 MySupportingBean 的依赖之前,不会绑定 MyScheduledBean。

请注意,该示例不会在 onTimeout 本身失败,而是在 CDI 尝试注入 MySupportingBean 时失败。

我在不同的论坛上阅读了很多帖子,很多人认为@Inject 总是更好。一般来说,我同意,但他们如何处理@Schedule 或@MessageDriven 与@Inject 结合?以我的经验,在这些情况下 bean 是否可以工作归结为运气不好,并且 bean 将任意失败,具体取决于 EJB 的部署顺序以及何时调用 @Schedule 或 onMessage。

0 投票
3 回答
12414 浏览

java - 重新部署 EJB 后出现 javax.ejb.NoSuchEJBException

使用 Glassfish 3.0.1 ... 如果我有一个 Web 应用程序远程访问另一个应用程序中的 EJB,并且重新部署了包含 EJB 的远程应用程序,我会得到一个 javax.ejb.NoSuchEJBException(参见下面的堆栈跟踪)。

这不应该工作吗?我可以看到有问题的 EJB 已成功部署,使用完全相同的 JNDI 名称。

除了重新启动 Web 应用程序之外,还有其他方法可以解决此问题吗?应该注意的是,在这个堆栈跟踪来自的特定示例中,我正在访问一个使用 CDI 注入 bean 的 servlet:

注入是使用以下生产者完成的,以获得正确的 EJB:

生产者用于更容易将服务包装在代理中,并更容易更改 EJB 的查找方式。

StatusService 接口和实现如下:


编辑:提供了我自己可能的解决方案。有更好的吗?


完整的堆栈跟踪:

0 投票
1 回答
833 浏览

seam - 焊缝(以前的焊接扩展项目)未初始化

我想在我的 java web 应用程序中使用记录器。

我正在使用 JBossAS 6.0.0.final、cdi (weld)、jsf ... 等。Seam Solder 建议使用抽象记录器不绑定到使用 jboss-logging api 的具体实现(slf4j、log4j 等)。

为了在您的代码中获取此记录器,您需要编写

seam-solder.jar 有这个记录器的生产者。

部署应用程序时出现错误

这是因为 seam-solder.jar 没有 META-INF/beans.xml 文件,而 cdi 容器是必需的。

如果手动在 seam-solder.jar 中添加 beans.xml 文件,则应用程序运行良好。

没有黑客怎么办?

为了构建我的应用程序,我使用了 maven,所以我的解决方案不舒服而且不好。

PS:以前的焊接扩展项目在 jar 中包含 META-INF/beans.xml 文件。