【问题标题】:Using a CDI @SessionScoped bean from a WebSocket @ServerEndpoint使用来自 WebSocket @ServerEndpoint 的 CDI @SessionScoped bean
【发布时间】:2014-01-29 17:24:42
【问题描述】:

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

对于 GlassFish 4,当使用来自带有 GlassFish 4.0 的 WebSocket @ServerEndpoint 注入的 @SessionScoped CDI bean 时,我收到一条错误消息: org.jboss.weld.context.ContextNotActiveException: WELD-001303 范围类型 javax.enterprise.context.SessionScoped 没有活动上下文

来自 JSP/servlet 类型的请求,使用 @SessionScoped CDI bean 很好,但不能来自 WebSocket @ServerEndpoint。

另请注意,使用来自@ServerEndpoint 的@Singleton CDI bean 可以正常工作,因此这不是通用依赖注入问题。

也许我做错了什么。

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

感谢您的宝贵时间。

【问题讨论】:

  • stackoverflow.com/questions/20872300/… 提出重复问题(简短回答,javax.websocket 中对 CDI 的支持没有得到很好的支持、定义和规范)
  • 我认为这不是同一个问题。我更新了我的帖子,提到@Singleton CDI bean 的注入工作正常。这确实是一个范围问题。

标签: websocket cdi


【解决方案1】:

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

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

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

【讨论】:

  • 是的,我认为每个人都对差距感到有些不安。希望我们可以在 MR 中解决这个问题(它会影响 EE 规范 + WebSocket 规范)。
  • 似乎还是不支持
  • 还不支持??
猜你喜欢
  • 2018-12-13
  • 1970-01-01
  • 2019-08-04
  • 2016-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多