总结我失败的项目:我的@ServerEndpoint
类与beans.xml文件一起打包在WAR中。反过来,我的WAR打包在一个EAR中,这个EAR文件被部署到内部使用Tyrus的GlassFish 4服务器上。
WebSocket specification说:
在Java EE平台中运行的Websocket端点必须已满 依赖注入支持,如CDI规范中所述。 Websocket实现是Java EE平台的一部分 支持字段,方法和构造函数注入使用 javax.inject。将注释注入所有websocket端点类, 以及对这些类使用拦截器。
我唯一能理解的是,将一个Enterprise JavaBean注入WebSocket应该不是火箭科学。然而,对我而言,无论我做什么,都无法奏效。我觉得最直观的是,只需要在服务器端点实例字段前加@EJB
或@Inject
注释,但这些注释中没有一个可以工作。该变量将为null。
一个互联网source 有点隐晦地说“由于错误”,他必须使用构造函数注入。我看到他已将注释@Named
添加到服务器端点。我使用了着名的复制粘贴模式,完成了他所做的事情,无论有没有@Named注释,它仍然无法正常工作。事实上,我的@Inject
带注释的构造函数甚至从未被调用过!
Tyrus user guide 表示可以将任何着名的会话bean声明注释与服务器端点(@Stateful
,@Stateless
和{{混合在一起1}})。所以我做了,仍然没有发生注射。如果我使用注释@Inject或@EJB无关紧要。
这很奇怪,因为图书Java EE 7 Developer Handbook 声称在第27页和第28页上有一个基于相同方法的工作示例。作者Peter Pilgrim注释了他的服务器端点@Singleton
。然后他使用@Stateless
进行注射。他说:
在Java EE 7中,我们还必须将[我们的服务器端点]声明为无状态 带有@Stateless的EJB,以便将[另一个EJB]作为依赖项注入。 (这是Java for WebSocket 1.0规范的结果。)注意 我们可以使用CDI的@ javax.annotation.Inject。
好吧所以他说我们必须使用@Stateless注释,并且“注意”可以使用@Inject。对我来说,听起来完全奇怪,我们“必须”在服务器端点上使用@Stateless注释,根据规范,除了无状态(!)之外的其他所有内容。我在互联网上的其他地方读到使用@Inject代替@EJB应该是一个修复。彼得“注意到”“我们可以使用”@Inject,但它闻起来很腥,好像他从未让@EJB工作,现在试图逃避责任。
嗯,无论是什么原因(“bug”或“规范的结果”),我都无法使用依赖注入来处理我在端点类本身或实例字段上使用的任何生动的注释组合。 / p>
是以编程方式使用JNDI查找,但它看起来很丑,应该避免使用。
答案 0 :(得分:3)
(只是重述我写入评论的内容以便从#34获得此问题;未答复"列表)
您应该查看Tyrus CDI sample/test。
它演示了当前实现可以做什么的列表。我们总是对新的测试用例持开放态度,但是规范本身存在一些问题 - 标准的请求范围不适用于WebSocket运行时,因为它处理servlet service / doFilter方法之外的消息。请参阅WEBSOCKET_SPEC-196和WEBSOCKET_SPEC-197。
答案 1 :(得分:2)
对我来说。使用@EJB用@Stateful和EJB对象声明来注释websocket完成了工作。
@Stateful
@ServerEndpoint(value = "/profileregistration")
public class ProfileRegistrationEndpoint {
@EJB
private ProfileRegistration profileRegEJB;
....
}