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

从WebSocket@ServerEndpoint使用CDI@SessionScoped bean

羊舌旭尧
2023-03-14

在web应用程序中,用户使用servlet HTTP会话。一些数据存储在CDI@SessionScoped bean中。在后面的一些页面中,用户浏览器和服务器之间执行WebSocket通信。

对于GlassFish 4,在GlassFish 4.0中使用WebSocket@ServerEndpoint中注入的@SessionScoped CDI bean时,会收到一条错误消息:org。jboss。焊接上下文ContextNotActiveException:WELD-001303作用域类型javax没有活动上下文。企业上下文会议范围

在JSP/servlet类型的请求中,使用@SessionScoped CDI bean是可以的,但不能使用WebSocket@ServerEndpoint。

还请注意,从@ServerEndpoint使用@Singleton CDIBeans可以很好地工作,因此这不是一个通用依赖项注入问题。

也许我做错了什么。

所以我的问题是@SessionScoped CDI bean可以从WebSocket@ServerEndpoint bean的方法中使用吗?如果是,如何?

谢谢你抽出时间。

共有1个答案

龙令雪
2023-03-14

这可能不是完全相同的问题,但问题非常相似,因此这里的答案适用。基本上,正如@JoakimErdfelt所指出的,websocket对CDI的支持充其量是有问题的。websocket规范忽略了提及哪些作用域是活动的。

开箱即用,这是Tyrus支持的:https://github.com/tyrus-project/tyrus/tree/master/samples/cdi/src/main/java/org/glassfish/tyrus/sample/cdi

如果需要,可以扩展它来启动会话范围(作为参考,Apache DeltaSpike的CDI上下文控件),但是由于协议的不同,它将是一个不同于已经通过HTTP建立的会话的会话。

 类似资料:
  • 我正在使用tomcat 9.0。4和Java1.8。在同一个项目中,jersey提供了一个Web服务。我可以从webservice类中使用@Inject,没有任何问题。我正试图通过下面的websocketendpoint显示使注入工作。 这是我的CDI实现: 我得到的只是一个java。lang.NullPointerException。 我找到了这个功能请求。所以我认为注射仍然没有在tomcat中

  • 总结一下我失败的项目:我的类与bean一起打包在一个WAR中。xml文件。我的WAR反过来被打包在一个EAR中,这个EAR文件被部署到内部使用Tyrus的GlassFish 4服务器上。 WebSocket规范说: 在JavaEE平台中运行的WebSocketendpoint必须具有CDI规范中描述的完全依赖注入支持。WebSocket实现JavaEE平台的一部分需要支持字段、方法和构造函数注入,

  • Spring Data Elasticsearch repositories也可以使用CDI注入。 Example 36. Spring Data Elasticsearch repositories using JavaConfig(使用JavaConfig) class ElasticsearchTemplateProducer { @Produces @Applicatio

  • 在发布这个问题之前,我谷歌了很多这个问题,并且在网络Socket@ServerEndpoint中从HttpServletRequest访问Http会话是我能找到的最好的问题/答案之一,但它似乎不能解决我的问题。 我可以通过这种方式从websocket访问HttpSession,但是我无法访问与普通HTTP请求相同的CDI会话bean实例。 我也尝试在会话中存储Weld实例,并尝试在WebSocke

  • 问题内容: 我想将消息从Java推送到WebSocket客户端。我已经成功地将js客户端发送到服务器,并在2个js客户端上收到了一条消息,因此客户端代码可以正常工作。 我的问题是,当Java应用程序中发生事件时,我想启动发送。因此,例如,每次下达10个订单时,都会向所有订阅的客户发送一条消息。这可能吗? 我当前的配置: 我想要做的是这样的: 并且所有订阅了Websocket的客户端都会收到一条消息

  • 我想将消息从Java推送到WebSocket客户端。我已经成功地让一个js客户端发送到服务器并在2个js客户端上接收到一条消息,所以客户端代码工作正常。 我的问题是,当Java应用程序中发生事件时,我想发起发送。例如,每次下10个订单,都会向所有订阅的客户端发送一条消息。这可能吗? 我当前的配置: 我想做的是这样的事情: 所有订阅websocket的客户端都会收到一条消息。