从WebSocket @ServerEndpoint使用CDI @SessionScoped bean

在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可以正常工作,所以这不是一个通用的依赖注入问题。

也许我做错了什么。

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

感谢您的时间。


这可能不是完全相同的问题,但问题非常相似,以至于这里的答案适用于此。 基本上,正如@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建立的会话。

链接地址: http://www.djcxy.com/p/62207.html

上一篇: Using a CDI @SessionScoped bean from a WebSocket @ServerEndpoint

下一篇: Do CDI Events observed across session scoped JSF backing beans