当前位置: 首页 > 知识库问答 >
问题:

JavaEE 7:如何将EJB注入到WebSocket ServerEndpoint中?

公西国发
2023-03-14

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

WebSocket规范说:

在JavaEE平台中运行的WebSocketendpoint必须具有CDI规范中描述的完全依赖注入支持。WebSocket实现JavaEE平台的一部分需要支持字段、方法和构造函数注入,使用javax.inject.注入注释到所有webSocketendpoint类中,以及对这些类使用拦截器。

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

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

Tyrus用户指南说,可以将任何著名的会话bean声明注释与服务器endpoint(@Stabaty@Statless@Singleton)混合在一起。所以我做了,但注射还是没有发生。我是否使用注释@Inject或@EJB并不重要。

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

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

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

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

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

共有2个答案

孟楷
2023-03-14

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

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


@EJB
private ProfileRegistration profileRegEJB;
....
}
楚嘉纳
2023-03-14

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

你应该检查Tyrus CDI样品/测试。

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

 类似资料:
  • 我有一个问题是将EJB注入到抽象类中,抽象类是我JSF CDI bean的父类。在我的项目中,我使用MyFaces CODI 1.0.5(ViewScope),Omniface 1.3,PrimeFaces 3.4.2和GlassFish3.1.2。 应用程序是一个EAR,抽象类位于EJB模块中,JSF CDI bean位于WAR模块中: 我的抽象类: 我的CDIBean: 当我部署应用程序并访问

  • 我有几个EJB3。x无状态会话bean,未定义接口。我需要将这些bean注入到Springbean中,但我无法这样做。 无接口EJB: 我的豆子: 还有我的豆子。xml 在初始化Spring容器时,我得到以下错误: 异常本身非常清楚——spring容器期望MyBean有一个本地接口视图作为其业务接口;但是,我没有(也不能介绍)。 非常感谢您的帮助!

  • 问题内容: 我试图将EJB注入到Spring(3.1.2)服务中(都在不同的 WAR中)两者都非常简单(删除了方法以简化示例): EJB: Service: 事情很简单,但我尝试过: 它没有用。然后我还尝试了: and 但都没有奏效。 我设法使用以下方法注入了EJB: 在我的spring配置和服务中: 但我真的不喜欢这种解决方案。我希望在某些注释中包含我的JNDI路径,例如: 问题答案: 我们找到

  • 有没有办法将@Named bean注入Singleton? 这是需要注入的类 bean用于视图实用程序(由Forge生成) 问题是我需要从@Startup@Singleton访问 但它总是失败,并抱怨说游戏会话不是一个实体 有没有办法将命名的有状态bean注入Singleton?如果没有,有什么解决办法吗? 谢谢

  • 问题内容: 使用新的EJB 3.1规范,是否可以将EJB注入pojo?我知道在EJB 3.0中,@ EJB批注可用于注入EJB,但这不适用于简单的pojos。 如果不是,我必须在JNDI中查找bean,因为我知道您不能简单地使用new关键字。 问题答案: 是的,使用JNDI查找。 由于您的POJO是由您创建的(我假设),因此容器不负责注入依赖项。

  • 我们有一个带有@EJB字段的Spring托管bean 在我们的spring xml中 这在WebLogic和Glassfish中有效,但在JBoss 7.1.2中无效(请参阅stacktrac@[1])。 仔细研究Spring代码,似乎它将JNDI名称(即“MyService”)转换为Java EE标准容器前缀“Java:comp/env/”[2],JBoss似乎不支持这个前缀。从JBoss日志来