Внедрение зависимостей в JavaFX и Jetty с WebSocket
Я работаю над приложением JavaFX, которое запускает встроенный сервер Jetty для прослушивания сетевых запросов. У меня есть случай, когда мне нужно ответить на обычный запрос HTTP, а также WebSockets. Поскольку этап контролируется этими запросами, у меня есть класс менеджера, который контролирует этап из базового класса приложения. Для иллюстрации приведем класс Application:
public class ServerApplication extends Application {
@Override
public void start(Stage primaryStage) throws Exception {
Log.InitLogger("subject server", Level.ALL);
DBServer.StartServer();
final LoginManager manager = new LoginManager(primaryStage);
final ResourceConfig rc = new ResourceConfig().register(
new AbstractBinder() {
@Override
protected void configure() {
bind(manager).to(SService.class);
bind(manager).to(DCS.class);
}
});
Server server = new Server(rc);
server.start();
manager.showLoginScreen();
}
}
Вот конструктор класса сервера:
public Server(final ResourceConfig rc) throws ServletException, DeploymentException, IOException {
ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
context.setContextPath("/");
jettyServer = new Server(65534 );
jettyServer.setHandler(context);
ServerConnector connector = new ServerConnector(jettyServer);
ServerContainer serverContainer = WebSocketServerContainerInitializer.configureContext(context);
serverContainer.addEndpoint(Socket.class);
jettyServer.addConnector(connector);
final ServletHolder jerseyServlet;
if(rc == null) {
jerseyServlet = context.addServlet(ServletContainer.class, "/*");
jerseyServlet.setInitParameter("jersey.config.server.provider.packages", SUBJECT_REST_PACKAGES);
}
else {
rc.packages(REST_PACKAGES);
jerseyServlet = new ServletHolder(new ServletContainer(rc));
context.addServlet(jerseyServlet, "/*");
}
jerseyServlet.setInitOrder(0);
// Tells the Jersey Servlet which REST service/class to load.
jmDNS = JmDNS.create(InetAddress.getLocalHost());
serviceInfo = ServiceInfo.create("_http._tcp.local.", "Service", 65534, "Ready");
}
Для классов, определенных в моем REST_PACKAGES, HK2 работает успешно и разрешает привязки. Однако у меня возникают проблемы с классом websocket и внедрением зависимостей. Я нашел этот пост: EnityManager Injection через HK2 в WebSockets, который почти работает, но когда создается экземпляр WebSocket, я получаю ошибку int, что HK2 не может разрешить класс DCSService, который является тем, что требуется сокету. Поэтому у меня вопрос: есть ли способ собрать все эти технологии, JavaFX, Websockets, Jetty и HK2 для совместной работы? Я знаю, что могут быть и другие способы добиться этого, но такие вещи, как события и модели пабов / суб-моделей, похоже, не подходят Это похоже на угловой случай.
Обновите, согласно запросу, вот код для конфигуратора:
открытый класс MyConfigurator расширяет Configurator { private ServiceLocator serviceLocator;
public MyConfigurator() {
serviceLocator = ServiceLocatorUtilities.createAndPopulateServiceLocator();
ServiceLocatorUtilities.enableImmediateScope(serviceLocator);
ServiceLocatorUtilities.bind(serviceLocator, new AbstractBinder() {
@Override
protected void configure() {
bind(MySocket.class).to(MySocket.class);
bind(LManager.class).to(DCService.class);
}
});
}
@Override
public <T> T getEndpointInstance(Class<T> endpointClass) {
return serviceLocator.getService(endpointClass);
}
}