在Web应用程序中,用户使用servlet HTTP会话。一些数据存储在CDI @SessionScoped bean中。稍后在某些页面中,WebSocket通信在用户浏览器和服务器之间执行。
使用GlassFish 4,当使用GlassSish 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吗?如果是,怎么样?
感谢您的时间。
答案 0 :(得分:0)
这可能不是完全相同的问题,但问题类似于此处的答案。基本上,正如@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建立的会话不同的会话。