JSP 中的 CDI 注入

2024-04-25

在 JSP 中,可以使用 EL 表达式(例如 ${myBean.myAttribute})来使用 CDI 托管 Bean。这里没问题。

我想在 JSP 文件中使用“常规注入”(即不使用 EL 表达式)和 @Inject,例如: 然后是 。即使该示例可以使用 EL 表达式来实现,但其他一些用例却不能。

应用服务器似乎并不完全支持这一点:
- JBoss 6.0.0、JBoss 6.1.0、Resin 4.0.22:好的,它工作得很好。
- JBoss 7.0.1、GlassFish 3.x(测试了多个版本):失败,myBean 保持为空。

它应该在 JSP 中正常工作,因为:
(1) 根据各种相关规范,它在 servlet 中运行良好,并且
(2) JSP 在运行时被转换为servlet。

你们知道我想做的事情是否得到支持吗?也许有任何内部/实施信息?


有趣的问题,如果你没有测试过它,我会赌一些钱,因为它不起作用;-)

CDI 建立在管理豆(JSR 316)。相应的定义非常宽松(故意):

从规格来看:

可以通过使用以下注释来声明托管 Bean: javax.annotation.ManagedBean 注释。托管 Bean 不得: Final类,抽象类,非静态内部类。一个托管 与常规 JavaBean 组件不同,Bean 可能不可序列化。

在基本组件模型中,托管 Bean 必须提供无参 构造函数,而是构建在托管 Bean 上的规范,例如 CDI (JSR-299) 可以放宽该要求并允许托管 Bean 为构造函数提供更复杂的签名,

可能发生的情况是容器扫描类路径并碰巧找到已编译的 JSP servlet。自从我上次看到这个以来已经有一段时间了,但我记得代码已生成,并且所有内容(包括脚本)都已进入doGet() or doPost()...!?所以,即使他们正式这样做不取消资格就定义而言,我怀疑 JSP scriplet 是否属于托管 bean。老实说,感觉非常错误;-)

我关注 CDI / Weld / Seam 邮件列表已经有一段时间了,不记得曾经提到过 JSP。与谷歌搜索此连接相同。

因此,您不应该依赖 CDI 来处理 scriptlet。恕我直言,这种行为比故意的行为有更多的副作用,并且可以在未来的版本中删除,恕不另行通知(甚至没有被注意到 :-)

因此,对 JB Nizet 的建议+1:将 servlet 与 CDI 结合使用,但不使用 JSP。

UPDATE:我试图提供帮助,而不是制造混乱;-) 我的观点是:恕我直言,在 JSP 中使用 CDI 感觉真的非常错误,但我没有在相关规范中找到任何可以证明这一点的内容。我只能说 JSP 是从未提及任何地方 - 这支持我的直觉(并且符合某些实现确实考虑它而其他实现则不考虑的观察结果)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JSP 中的 CDI 注入 的相关文章

随机推荐