У меня есть webapp, который требует использования веб-сокетов Tomcat 7.
В этом webapp все стандартные сервлеты (те, которые расширяют javax.servlet.http.HttpServlet
) работают красиво (и правильно) с помощью Google Guice. Чтобы мой сервлет работал с обработчиками Guice, я просто:
- украсить сервлет
@Singleton
- объявить частный
Provider
дляMyHandler
экземпляр и создать сеттер, который помечен для инъекций - украсить конструктор сервлета
@Inject
Пример демонстрации вышеперечисленных пунктов:
@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;
}
...
}
Как можно вызвать один и тот же обработчик Guice, названный выше MyHandler
из WebSocketServlet
?
Я не могу принять тот же стиль, что и в стандартном случае использования сервлета, потому что вместо того, чтобы иметь сервлет Singleton, как в случае стандартных сервлетов, каждое сообщение WebSocket приводит к расширению экземпляра MessageInbound
; то соответствующий метод, вызывающий MyHandler
, вызывается из метода (например, onOpen
или onClose
) в экземпляре MessageInbound; не из метода внутри экземпляра HttpServlet
как MyServlet
выше.
Что я попробовал? Я попробовал некоторые (концептуально неправильные) решения, такие как вызов обработчиков websocket-servlet из экземпляра MessageInbound
; это, конечно, приводит к проблемам с определением области обзора ниже по трассе Guice. Каков концептуально правильный способ сделать это?