问题标签 [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.
jsf - 支持 bean (@ManagedBean) 还是 CDI Bean (@Named)?
我刚刚开始阅读Core JavaServer Faces,第 3 版。他们这样说(强调我的):
对于可以在 JSF 页面中使用的 bean,有两种独立的机制,CDI bean 和 JSF 管理的 bean,这是一个历史性的意外。我们建议您使用 CDI bean,除非您的应用程序必须在普通的 servlet 运行程序(如 Tomcat)上运行。
为什么?他们没有提供任何理由。我一直在使用@ManagedBean
GlassFish 3 上运行的原型应用程序中的所有 bean,但我并没有真正注意到任何问题。我不特别介意从@ManagedBean
to迁移@Named
,但我想知道我为什么要打扰。
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)
提前致谢!
问候,亚历克斯
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 来触发事件:
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。
感谢您提供任何信息,伊格纳西奥
java - CDI 中的@ApplicationScoped 和@Singleton 范围有什么区别?
在 CDI 中有@ApplicationScoped
和 ( javax.inject
)@Singleton
伪作用域。它们之间有什么区别?@ApplicationScoped
除了被代理的事实,而@Singleton
不是被代理的事实。
我可以把我的@Singleton
豆子换成@ApplicationScoped
吗?@ApplicationScoped
bean 可以有两个(或更多)实例吗?
jsf - CDI SessionScoped Bean 在同一会话中产生两个实例
对于同一个会话,我有两个 SessionScoped CDI bean 实例。我的印象是 CDI 会为我生成一个实例,但它生成了两个。我是否误解了 CDI 的工作原理,还是我发现了一个错误?
这是bean代码:
这是 Facelet 代码:
这是部署和导航到页面的输出:
使用 GlassFish 3.0.1
redirect - CDI @Conversation 未通过 handleNavigation() 传播
handleNavigation()
当我通过该方法重定向视图时,我遇到了长时间运行对话的传播问题。这是我的测试代码:
我有一个conversationscoped
bean 和两个视图:
conversationStart.xhtml
在浏览器中使用 URL 调用
http://localhost/tests/conversationStart.jsf?paramTestId=ParameterInUrl
参数被写入beanfield
并正确显示在视图中。导航到下一个视图有 3 种不同的可能性。所有 3 工作正常。也显示beanfield
下一个视图 ( conversationLogin.xhtml
):
当我通过单击按钮返回起始页时,对话 bean 仍然包含所有值。所以一切都很好。这是豆:
现在问题来了!!
一旦我尝试在preRenderView
bean 的方法中重定向页面(只需取消注释方法中的代码),handleNavigation()
就会在下一个视图中再次创建 bean,而不是使用已经创建的实例。虽然cid
参数被传播到下一个视图!
有人知道出了什么问题吗?
最好的问候托马斯
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。
java - 重新部署 EJB 后出现 javax.ejb.NoSuchEJBException
使用 Glassfish 3.0.1 ... 如果我有一个 Web 应用程序远程访问另一个应用程序中的 EJB,并且重新部署了包含 EJB 的远程应用程序,我会得到一个 javax.ejb.NoSuchEJBException(参见下面的堆栈跟踪)。
这不应该工作吗?我可以看到有问题的 EJB 已成功部署,使用完全相同的 JNDI 名称。
除了重新启动 Web 应用程序之外,还有其他方法可以解决此问题吗?应该注意的是,在这个堆栈跟踪来自的特定示例中,我正在访问一个使用 CDI 注入 bean 的 servlet:
注入是使用以下生产者完成的,以获得正确的 EJB:
生产者用于更容易将服务包装在代理中,并更容易更改 EJB 的查找方式。
StatusService 接口和实现如下:
编辑:提供了我自己可能的解决方案。有更好的吗?
完整的堆栈跟踪:
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 文件。