CDI 托管 Bean 和 JSF 托管 Bean 可以相互通信吗?
我有一个 Tomcat 6 JSF Web 应用程序,我想使用 CDI bean 来设置它。不过,我必须逐渐将项目转换为 CDI。
我的问题是:CDI bean 和传统的 JSF 托管 bean 可以相互注入吗?
谢谢。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
所有 JSF 托管 Bean (JMB) 要么自动成为 CDI 托管 Bean (CMB),要么可以使用 beans.xml 标记文件来识别。 (CMB 的要求设置得非常低,基本上只是规定 无参数构造函数的存在。)
这意味着您应该能够使用(读:注入)所有 JMB,几乎不需要额外的努力。
但是,由于 JMB 使用与 CMB 不同的作用域(
javax.faces.*
与javax.enterprise.*
),因此会出现问题。最好通过注册相对简单的 CDI 来解决这些问题-扩展:当 CDI 服务器(Tomcat)启动时,它将引发一些您可以观察到的事件 - 这是您可以检测 JMB 并将其转换为正确范围的 CMB 的地方。
但在开始黑客攻击之前:所有这些都已由 Seam 3 Faces 模块。只需将其放入类路径中,所有 JSF 作用域都会桥接到 CDI 作用域。
All JSF managed beans (JMB) either are CDI managed beans (CMB) automatically, or can be recognized as such using the beans.xml marker file. (The requirements of a CMB are set very low and basically just dictate the existence of a non-parameter constructor.)
This means that you should be able to use (read: inject) all JMBs with almost no extra effort.
However, problems will arise because JMBs use different scopes than CMBs (
javax.faces.*
vs.javax.enterprise.*
)These are best solved by registering a relative simple CDI-extension: When the CDI server (Tomcat for you) starts, it will raise a couple of events that you can observe - this is be the place where you can detect JMBs and convert them into correctly scoped CMBs.
But before you start hacking: All this has already been done by the Seam 3 Faces module. Simply put it in your classpath, and all JSF-scopes are bridged to CDI-scopes.