gpt4 book ai didi

jsp - JSP 中的 CDI 注入(inject)

转载 作者:行者123 更新时间:2023-12-04 20:53:38 26 4
gpt4 key购买 nike

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

我想在 JSP 文件中使用带有 @Inject 的“常规注入(inject)”(即不使用 EL 表达式),例如:
<%! @Inject MyBean myBean; %> 然后是 <%= myBean.getMyAttribute() %>。即使该示例可以使用 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 基于 托管 bean (JSR 316)。相应的定义非常宽松(故意):

从规范:

A Managed Bean can be declared by annotating its class with the javax.annotation.ManagedBean annotation. A Managed Bean must not be: a final class, an abstract class, a non-static inner class. A Managed Bean may not be serializable, unlike a regular JavaBean component.

In the basic component model, Managed Beans must provide a no-argument constructor, but a specification that builds on Managed Beans, such as CDI (JSR-299), can relax that requirement and allow Managed Beans to provide constructors with more complex signatures,



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

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

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

因此,对于 JB Nizet 的提议 +1:使用带有 CDI 的 servlet,而不是 JSP。

更新 :我试图提供帮助,而不是制造困惑 ;-) 我的观点是:恕我直言,在 JSP 中使用 CDI 感觉真的很错误,但我在相关规范中没有找到任何可以证明这一点的东西。我只能说,JSP 从来没有在任何地方被提及——哪种支持我的直觉(并且符合某些实现确实考虑它的观察,而其他实现则不考虑它)。

关于jsp - JSP 中的 CDI 注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7385723/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com