【发布时间】:2012-12-07 03:28:57
【问题描述】:
我有一个需要使用 Tomcat 7 网络套接字的 web 应用程序。
在这个 web 应用程序中,所有标准 Servlet(那些扩展 javax.servlet.http.HttpServlet)都可以很好地(并且正确地)与 Google Guice 一起工作。为了让我的 Servlet 与 Guice 处理程序一起工作,我只是:
- 用
@Singleton装饰servlet - 为
MyHandler实例声明私有Provider并生成一个标记为注入的设置器 - 用
@Inject装饰Servlet的构造函数
举例说明以上几点:
@Singleton
public class MyServlet extends HttpServlet {
private Provider<MyHandler> myHandler;
@Inject
MyServlet() {
}
@Override
protected void service(..) throws ServletException { ... }
@Inject
public void setMyHandler(Provider<MyHandler> myHandler) {
this.myHandler = myHandler;
}
...
}
如何从WebSocketServlet 调用上面称为myHandler 的同一个Guice 处理程序?
我不能采用与标准 servlet 用例相同的样式,因为与标准 servlet 的情况不同,每个 WebSocket 通信都会产生一个扩展 MessageInbound 的实例,而不是使用 Singleton servlet;然后从 MessageInbound 实例中的方法(例如 onOpen 或 onClose)调用将调用 MyHandler 的适当方法; 不是来自HttpServlet 实例中的方法,如上面的MyServlet。
我尝试了什么? 我确实尝试了一些(概念上错误的)解决方案,例如从 MessageInbound 实例中调用 websocket-servlet 的处理程序;这当然会导致降低 Guice 堆栈跟踪的范围问题。这样做的概念正确方法是什么?
【问题讨论】:
-
如果我理解你,你会覆盖 WebSocketServlet#createWebSocketInbound 在哪里创建 MessageInbound 的新实例?如果这是真的,那么简单地让 Guice 为您创建 MessageInbound(如果需要,辅助注入)。我看到的唯一问题是 http 请求/响应的范围,因为 guice 过滤器使用线程本地来跟踪。但这可以得到补偿。我没听错吗?
-
感谢您的评论,但我不明白这部分:“那么简单,让 Guice 为您创建 MessageInbound(如果需要辅助注入)”
标签: java servlets websocket tomcat7 guice