Dependency injection JavaEE7:如何将EJB注入WebSocket服务器端点?

Dependency injection JavaEE7:如何将EJB注入WebSocket服务器端点?,dependency-injection,websocket,ejb,java-ee-7,tyrus,Dependency Injection,Websocket,Ejb,Java Ee 7,Tyrus,总结一下我失败的项目:我的@ServerEndpoint类与beans.xml文件一起打包在WAR中。我的WAR反过来被打包在一个EAR中,这个EAR文件被部署到内部使用Tyrus的GlassFish 4服务器上 可能吗? WebSocket说: 在JavaEE平台中运行的Websocket端点必须具有完整的 CDI规范中描述的依赖项注入支持。 JavaEE平台的Websocket实现部分需要 使用 javax.inject。将注释注入所有websocket端点类, 以及对这些类使用拦截器 关于

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

可能吗? WebSocket说:

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

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

已经是一个已知的问题了吗? 一家互联网有点隐晦地说,“由于一个bug”,他必须使用构造函数注入。我看到他已将名为的注释添加到服务器端点。我使用了著名的复制粘贴模式,做了他做的事情,有@Named注释和没有@Named注释,但仍然不起作用。事实上,我的
@Inject
注释构造函数甚至从未被调用过

Tyrus说可以将任何著名的会话bean声明注释与服务器端点混合在一起(
@Stateful
@Stateless
@Singleton
)。所以我做了,但是注射失败了。不管我是使用注释@Inject还是@EJB

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

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

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

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

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

(只是重复我在评论中写的内容,以便从“未回答”列表中获取此问题)

你应该退房


它演示了如何使用当前的实现。我们总是欢迎新的测试用例,但是规范本身存在一些问题——标准请求范围不适用于WebSocket运行时,因为它处理servlet服务/doFilter方法之外的消息。请参见和。

为我介绍。用@Stateful注释websocket,用@EJB注释EJB对象声明就完成了这项工作

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


@EJB
private ProfileRegistration profileRegEJB;
....
}

嗨,Martin,你看过Tyrus CDI样品/测试吗?(). 它基本上列出了您可以对当前实现执行的操作。我们总是欢迎新的测试用例,但是规范本身存在一些问题——标准请求范围不适用于WebSocket运行时,因为它处理servlet服务/doFilter方法之外的消息。请参阅和@PavelBuckek,该评论似乎是一个很好的答案。在使用glassfish 4.0的类似情况下,我通过在
@ServerEndPoint
旁边添加
@Stateless
使注入的bean正常工作
@Named
不起作用。在我的注入bean上,
@EJB
@Inject
都起作用。我想这对你没有帮助,因为你已经试过了。但多亏了你,因为你的一个建议确实对我有用。@Toto2我也在Glassfish 4.0安装上测试了它。正如你所说,这个建议奏效了。我不知道把它注释为@Stateless是否是正确的做法。对我来说已经很久了。把WebSocket类变成一个功能齐全的EJB是没有意义的。如果您为类
@ManagedBean
添加注释会怎么样?您可以添加
ProfileRegistration的代码,或者只说您使用了什么注释?您使用的是哪个版本的Java EE?使用Java EE 8,由于隐私问题,我无法提供完整的代码annotations@Stateful用于使服务器websocket成为有状态ejb@ServerEndpoint(value=“/profileregistration”)用于使用websocket使用的value属性将类定义为websocket服务器client@Stateful在服务器中websocket对我来说已经足够了:现在注入的Singleton不是null,我可以使用它。在Wildfly 9、jdk 8上测试