使用WebSocket在JavaFX和Jetty中注入java依赖项
我正在开发一个JavaFX应用程序,它启动一个嵌入式Jetty服务器来监听网络请求。我有一个用例,需要响应正常的HTTP请求和WebSocket。由于stage由这些请求控制,因此我有一个manager类从基本应用程序类接管stage的控制。为了进行说明,下面是应用程序类:
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_包中定义的类,HK2可以成功地工作并解析绑定。然而,我遇到了websocket类和依赖注入的问题。我发现了这篇文章:EnityManager Injection via HK2 in WebSockets,它几乎可以工作,但是当WebSocket被实例化时,我得到一个错误int,HK2无法解析DCSService类,这是socket所需要的。所以我的问题是,是否有一种方法可以将所有这些技术,JavaFX、Websockets、Jetty和HK2组合在一起工作?我知道可能有其他的方法来实现这一点,但像事件和酒吧/酒吧模型这样的东西似乎并不适合。这似乎是一个极端的情况
根据请求进行更新,以下是配置程序的代码:
公共类MyConfigurator扩展配置程序{ 专用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) 个答案