JavaEE7:如何将EJB注入WebSocketServerEndpoint



总结我失败的项目:我的@ServerEndpoint类与beans.xml文件一起打包在WAR中。反过来,我的WAR被打包在一个EAR中,这个EAR文件被部署到内部使用Tyrus的GlassFish 4服务器上。

这可能吗

WebSocket规范说:

在Java EE平台中运行的Websocket端点必须具有完整的CDI规范中描述的依赖注入支持。Java EE平台的Websocket实现部分需要使用javax.inject.将注释注入到所有websocket端点类中,以及对这些类使用拦截器。

我对这段话唯一能理解的是,将Enterprise JavaBean注入到WebSocket中不应该是火箭科学。然而,对我来说,无论我做什么,都是行不通的。我觉得最直观的是,应该只需要在服务端点实例字段前面加上@EJB@Inject注释,但这些注释都不起作用。变量将为null。

已经是一个已知的问题了

一个互联网消息来源有点隐晦地说,"由于一个错误",他必须使用构造函数注入。我看到他已经向服务器端点添加了注释@Named。我使用了著名的复制粘贴模式,并完全按照他所做的操作,无论有没有@Named注释,它仍然不起作用。事实上,我的@Inject带注释的构造函数从来没有被调用过!

Tyrus用户指南指出,可以将任何著名的会话bean声明注释与服务器端点(@Stateful@Stateless@Singleton)混合在一起。所以我照做了,但注射还是没有成功。我使用注释@Inject还是@EJB并不重要。

这很奇怪,因为《Java EE 7开发人员手册》一书声称在第27页和第28页上有一个基于相同方法的工作示例。作者Peter Pilgrim注释了他的服务器端点@Stateless。然后,他使用@Inject进行注射。他说:

在Java EE 7中,我们还必须将[我们的服务器端点]声明为无状态带有@Stateless的EJB,以便将[另一个EJB]作为依赖项注入。(这是Java for WebSocket 1.0规范的结果。)注意我们可以使用CDI的@javax.annotation.Inject。

好的,所以他说我们必须使用@Stateless注释,并"注意"可以使用@Inject。对我来说,我们"必须"在服务器端点上使用@Stateless注释,这听起来非常奇怪,根据规范,它不是无状态的(!)。我在互联网上的其他地方读到,使用@Inject而不是@EJB应该是一个解决方案。Peter"注意到"我们可以使用"@Inject,但它闻起来很可疑,好像他根本没有让@EJB工作,现在他试图逃避责任。

好吧,不管是什么原因("bug"或"规范的后果"),我都无法让依赖项注入工作,无论我在端点类本身或实例字段上使用了什么生动的注释组合。

最终解决方案

是以编程方式使用JNDI查找,但它看起来很难看,应该避免。

(只是重述我在评论中写的内容,以从"未回答"列表中得到这个问题)

您应该检查Tyrus CDI样本/测试。

它展示了列出您可以对当前实现做些什么。我们总是对新的测试用例持开放态度,但规范本身也存在一些问题——标准的请求范围不适用于WebSocket运行时,因为它处理servlet service/doFilter方法之外的消息。请参见WEBSOCKET_SPEC-196和WEBSOCKET_SPEC-197。

对我来说,用@Stateful注释websocket和用@EJB声明EJB对象就完成了这项工作。

@Stateful
@ServerEndpoint(value = "/profileregistration")
public class ProfileRegistrationEndpoint {

@EJB
private ProfileRegistration profileRegEJB;
....
}

相关内容

  • 没有找到相关文章

最新更新