在 Web 应用程序中,用户使用 servlet HTTP 会话。一些数据存储在 CDI @SessionScoped beans 中。稍后在某些页面中,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 beans 可以从 WebSocket @ServerEndpoint beans 的方法中使用吗?如果是,怎么办?
感谢您的时间。
这可能不是完全相同的问题,但问题足够相似,那里的答案适用于此处。基本上,正如 @JoakimErdfelt 指出的那样,CDI 的 websocket 支持充其量也是有问题的。 websocket 规范忽略了哪些范围是活动的。
Tyrus 开箱即用,支持以下功能:https://github.com/tyrus-project/tyrus/tree/master/samples/cdi/src/main/java/org/glassfish/tyrus/sample/cdi https://github.com/tyrus-project/tyrus/tree/master/samples/cdi/src/main/java/org/glassfish/tyrus/sample/cdi
如果需要,您可以扩展它以启动会话范围(供参考,Apache DeltaSpike 的 CDI 上下文控制),但由于协议差异,它将是一个与已通过 HTTP 建立的会话不同的会话。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)