Внедрение зависимостей в 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);
}
}

0 ответов

Другие вопросы по тегам