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

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

应该可以吗

WebSocket specification说:

Websocket endpoints running in the Java EE platform must have full
dependency injection support as described in the CDI specification.
Websocket implementations part of the Java EE platform are required to
support field,method,and constructor injection using the
javax.inject. Inject annotation into all websocket endpoint classes,
as well as the use of interceptors for these classes.

我唯一可以理解的这一段是将Enterprise JavaBean注入WebSocket应该不是火箭科学。然而,对我来说,无论我做什么,都没有工作。我觉得最直观的一个应该只需要使用@EJB或@Inject注释来将服务器端点实例字段前缀,但是这些注释中没有一个可以正常工作。该变量将为null。

已经是一个已知的问题?

一个互联网source有点神秘地说,“由于一个错误”他必须使用构造函数注入。我看到他已经将注释@Named添加到服务器端点。我使用着名的复制粘贴模式,并完全按照他所做的,使用和不使用@Named注释,它仍然不起作用。事实上,我的@Inject注释构造函数从来没有被称为!

Tyrus user guide说,可以将任何着名的会话bean声明注释与服务器端点(@Stateful,@Stateless和@Singleton)混合在一起。所以我做了,仍然注射没有发生。如果我使用注释@Inject或@EJB无关紧要。

这很奇怪,因为Java EE 7 Developer Handbook这本书根据相同的方法声称在第27页和第28页上有一个例子。作者Peter Pilgrim注释了他的服务器端点@Stateless。然后他使用@Inject来进行注入。他说:

In Java EE 7 we must also declare [our server endpoint] as a stateless
EJB with @Stateless in order to inject [another EJB] as a dependency.
(This is a consequence of Java for WebSocket 1.0 specification.) Note
that we can use @javax.annotation.Inject from CDI.

好吧,他说我们必须使用@Stateless注释,“注意”可以使用@Inject。对我来说,听起来很奇怪,我们“必须”在服务器端点上使用@Stateless注释,根据规范,除了无状态(!)以外的其他任何注释。我已经在互联网上的其他地方阅读过,使用@Inject而不是@EJB应该是一个修复。彼得“注意到,”我们可以使用“@Inject,但它闻起来很腥味,仿佛他从来没有得到@EJB的工作,现在试图逃避责任。

那么,无论什么原因(“bug”或“规范的后果”),我无法使我的依赖注入工作在终端类本身或实例字段上使用的任何生动的注释组合。

最终修复

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

(只是重申我写的评论,从“未回答的”列表中得到这个问题)

你应该检查出Tyrus CDI sample/test

它演示了您可以使用当前实现的列表。我们总是为新的测试用例开放,但规范本身存在一些问题 – 标准的请求范围对于WebSocket运行时不起作用,因为它处理servlet服务/ doFilter方法之外的消息。见WEBSOCKET_SPEC-196WEBSOCKET_SPEC-197

相关文章

迭代器模式(Iterator)迭代器模式(Iterator)[Cursor]意图...
高性能IO模型浅析服务器端编程经常需要构造高性能的IO模型,...
策略模式(Strategy)策略模式(Strategy)[Policy]意图:定...
访问者模式(Visitor)访问者模式(Visitor)意图:表示一个...
命令模式(Command)命令模式(Command)[Action/Transactio...
生成器模式(Builder)生成器模式(Builder)意图:将一个对...