Java EE 7:如何将EJB注入WebSocket ServerEndpoint?

Mar*_*son 20 dependency-injection ejb websocket java-ee-7 tyrus

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

应该可以吗?

WebSocket 规范说:

在Java EE平台中运行的Websocket端点必须具有完全依赖注入支持,如CDI规范中所述.要使用javax.inject支持字段,方法和构造函数注入,需要Java EE平台的Websocket实现部分.将注释注入所有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应该是一个修复.彼得"注意到""我们可以使用"@Inject,但它闻起来很腥,好像他从未让@EJB工作,现在试图逃避责任.

好吧,不管是什么原因("bug"或"规范的结果"),我无法使用我的依赖注入来处理我在端点类本身或实例字段上使用的任何生动的注释混合.

终极修复

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

Pav*_*cek 3

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

您应该查看Tyrus CDI 示例/测试

它演示了您可以使用当前实施执行的操作。我们始终对新的测试用例持开放态度,但规范本身存在一些问题 - 标准请求范围不适用于 WebSocket 运行时,因为它处理 servlet service/doFilter 方法之外的消息。请参阅WEBSOCKET_SPEC-196WEBSOCKET_SPEC-197