JSP中的CDI注入

JSP中的CDI注入,jsp,jakarta-ee,el,code-injection,cdi,Jsp,Jakarta Ee,El,Code Injection,Cdi,在JSP中,可以使用EL表达式(如${myBean.myAttribute})使用CDI管理的bean。没问题 我想在JSP文件中使用@Inject的“常规注入”(即不使用EL表达式),例如: 后来呢。即使该示例可以使用EL表达式实现,其他一些用例也无法实现 应用服务器似乎并不完全支持这一点: -JBoss 6.0.0、JBoss 6.1.0、Resin 4.0.22:好的,它工作正常。 -JBoss7.0.1,GlassFish3.x(测试了几个版本):失败,myBean仍然为空 它在JSP中

在JSP中,可以使用EL表达式(如${myBean.myAttribute})使用CDI管理的bean。没问题

我想在JSP文件中使用@Inject的“常规注入”(即不使用EL表达式),例如: 后来呢。即使该示例可以使用EL表达式实现,其他一些用例也无法实现

应用服务器似乎并不完全支持这一点:
-JBoss 6.0.0、JBoss 6.1.0、Resin 4.0.22:好的,它工作正常。
-JBoss7.0.1,GlassFish3.x(测试了几个版本):失败,myBean仍然为空

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


你们知道我想做的事是否得到支持吗?可能有任何内部/实现信息吗?

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

CDI构建在托管bean(JSR 316)的基础上。相应的定义相当宽松(有意):

根据规范:

托管Bean可以通过用 javax.annotation.ManagedBean注释。托管Bean不能是:一个 最后一个类,一个抽象类,一个非静态的内部类。管理的 Bean可能不可序列化,这与常规JavaBean组件不同

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

可能发生的情况是,容器扫描类路径并碰巧找到已编译的JSP servlet。我已经有一段时间没有看到它了,但我记得代码已经生成,所有东西(包括scriptlet)都在
doGet()
doPost()
中。。。!?因此,即使它们在定义方面做了“强>不合格”<强> >,我怀疑JSP脚本是您想考虑的托管bean。老实说,这感觉大错特错;-)

我一直在关注CDI/Weld/Seam邮件列表,不记得有人提到过JSP。谷歌搜索这个连接也是如此

因此,您不应该依赖CDI来处理Scriptlet。IMHO这种行为与其说是有意的,不如说是一种副作用,可以在未来的版本中不经通知就删除(或者甚至不被注意:-)

因此,对于JB Nizet的建议+1:将servlet与CDI一起使用,而不是JSP


更新:我试图帮助,而不是制造混乱;-)我的观点是:我觉得在JSP中使用CDI是非常错误的,但是我在相关规范中没有找到任何东西可以证明这一点。我所能说的是JSP从来没有提到过任何地方——哪种支持我的直觉(并且符合一些实现会考虑它的观察,其他人不这么认为)。

< P>我不认为在JSP中有一个便携@注入可用,但是应该可以实现它(在容器级)。与servlet的工作方式相同

虽然我同意这不是使用CDI的最佳方式,但从技术上讲,我认为没有任何理由反对它。例如,AFAIK@Inject-in-servlet透明地使用ThreadLocal代理,为什么不在JSP中使用此功能?

尝试以下方法:-

<%!
    @Inject
    private UserService userService;
%>

这对我有用:)


注意:使用括号
而不是

我不知道是否支持(或应该支持),但我知道在JSP中这样做是个坏主意。JSP旨在生成标记。多年来,它们都不应该包含Java脚本。在常规servlet中执行您想要执行的操作,并分派到JSP。仅在JSP中使用EL和JSP标记。根据应用程序需求,在某些情况下,使用servlet和/或MVC框架会有所帮助。但有时添加servlet只是为了将服务bean引用传递给JSP是一种过分的做法,可能被认为是一种反模式。这里我真正感兴趣的是理解JSP的CDI行为,即使有其他解决方案我不理解您关于“CDI建立在托管bean上”的断言。事实上,CDI和不需要在其托管bean中使用
@ManagedBean
注释——一个类就是bean。另外,Weld参考说明,因此我敢打赌JSP生成的servlet将支持注入(不考虑注入的好坏)。不,不,你将JSF
javax.faces.bean.ManagedBean
与CDI
javax.annotation.ManagedBean
混为一谈,这是一个不幸的歧义。是(重新)评估CDI的良好开端,请同时检查引用的JSR 316。。。是的,servlet是bean,这是毫无疑问的。但老实说,我不知道生成的servlet是否适合该方案——就像我以前写的那样。并非所有JSP脚本元素都以doGet/doPost结束,JSP“声明”(即“东西”)定义类属性或方法。这正适合@Inject属性。简,从这个澄清中,我不明白你的逻辑含义,也不明白你为什么说“他们在形式上不合格”。