依赖注入到嵌入式码头上的 websocket 端点
Dependency injection into websocket endpoint on embedded jetty
我有以下 websocket 端点:
import javax.inject.Inject;
import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
@ServerEndpoint(value = "/blabla")
public class WebsocketService {
@Inject
private DatabaseProvider dbProvider;
@OnOpen
public void onOpen(Session session) throws IOException {
//do something
}
@OnMessage
public void onMessage(Session session, String socketPacket) throws IOException {
//do something else
}
...
}
启动嵌入式服务器的代码:
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.websocket.jsr356.server.deploy.WebSocketServerContainerInitializer;
import javax.websocket.server.ServerContainer;
//other imports
public static void main(String[] args) {
Server server = null;
try {
server = new Server(3081);
ServletContextHandler context = new ServletContextHandler();
context.setContextPath("/");
ServerContainer serverContainer = WebSocketServerContainerInitializer.configureContext(context);
serverContainer.addEndpoint(WebsocketService.class);
server.setHandler(context);
server.start();
server.join();
} catch (Exception e) {
logger.error(e.getMessage());
} finally {
if (server != null) {
server.destroy();
}
}
}
上面的代码非常适合没有依赖注入的情况。但是,我想将 dbProvider 注入我的 WebsocketService 并在 onMessage 方法中使用它。
问题 1:如何为 websocket 服务器注入?
P.S。有多个示例说明如何使用 ResourceConfig + AbstractBinder + ServletContainer 为 REST 端点完成依赖注入,但我不确定它如何应用于 websocket 服务器的情况。
问题 2:如何将简单的资源端点添加到同一服务器(以服务 javascript)?
这个问题中有很多变化的部分。
首先,您必须设置 Weld(CDI 实施)以将其与您的 ServletContextHandler
正确集成
通常是这样看的...
ServletContextHandler context = new ServletContextHandler();
// Enable Weld + CDI
context.setInitParameter(
CdiServletContainerInitializer.CDI_INTEGRATION_ATTRIBUTE,
CdiDecoratingListener.MODE);
context.addBean(
new ServletContextHandler.Initializer(context,
new CdiServletContainerInitializer()));
context.addBean(
new ServletContextHandler.Initializer(context,
new org.jboss.weld.environment.servlet.EnhancedListener()));
然后 Jetty 和 Weld 之间的注入(实际上是装饰)在内部自动处理。
注意: ServletContexthandler.Initializer
是一种方便 class 让你的 embedded-jetty 到 运行 任意 javax.servlet.ServletContainerInitializer
没有完整的 WebApp 的所有开销和复杂的初始化过程。
CdiServletContainerInitializer
是 Jetty 提供的 ServletContainerInitializer
,它在 ServletContext
中设置了各种内容,以允许 Weld 将自身正确连接到 ServletContext
。
EnhancedListener
也是焊接提供的 ServletContainerInitializer
,它在焊接 + CDI 的接线一侧。
为了提供静态文件,您需要在 ServletContextHandler
中定义一个“基本资源”,然后将 DefaultServlet
添加到 [的“默认”url-pattern =23=].
ServletContextHandler context = new ServletContextHandler();
context.setBaseResource(Resource.newResource(webRootUri));
context.addServlet(DefaultServlet.class, "/");
如果您想一起查看所有这些内容,请在
查看示例项目
我有以下 websocket 端点:
import javax.inject.Inject;
import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
@ServerEndpoint(value = "/blabla")
public class WebsocketService {
@Inject
private DatabaseProvider dbProvider;
@OnOpen
public void onOpen(Session session) throws IOException {
//do something
}
@OnMessage
public void onMessage(Session session, String socketPacket) throws IOException {
//do something else
}
...
}
启动嵌入式服务器的代码:
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.websocket.jsr356.server.deploy.WebSocketServerContainerInitializer;
import javax.websocket.server.ServerContainer;
//other imports
public static void main(String[] args) {
Server server = null;
try {
server = new Server(3081);
ServletContextHandler context = new ServletContextHandler();
context.setContextPath("/");
ServerContainer serverContainer = WebSocketServerContainerInitializer.configureContext(context);
serverContainer.addEndpoint(WebsocketService.class);
server.setHandler(context);
server.start();
server.join();
} catch (Exception e) {
logger.error(e.getMessage());
} finally {
if (server != null) {
server.destroy();
}
}
}
上面的代码非常适合没有依赖注入的情况。但是,我想将 dbProvider 注入我的 WebsocketService 并在 onMessage 方法中使用它。
问题 1:如何为 websocket 服务器注入?
P.S。有多个示例说明如何使用 ResourceConfig + AbstractBinder + ServletContainer 为 REST 端点完成依赖注入,但我不确定它如何应用于 websocket 服务器的情况。
问题 2:如何将简单的资源端点添加到同一服务器(以服务 javascript)?
这个问题中有很多变化的部分。
首先,您必须设置 Weld(CDI 实施)以将其与您的 ServletContextHandler
通常是这样看的...
ServletContextHandler context = new ServletContextHandler();
// Enable Weld + CDI
context.setInitParameter(
CdiServletContainerInitializer.CDI_INTEGRATION_ATTRIBUTE,
CdiDecoratingListener.MODE);
context.addBean(
new ServletContextHandler.Initializer(context,
new CdiServletContainerInitializer()));
context.addBean(
new ServletContextHandler.Initializer(context,
new org.jboss.weld.environment.servlet.EnhancedListener()));
然后 Jetty 和 Weld 之间的注入(实际上是装饰)在内部自动处理。
注意: ServletContexthandler.Initializer
是一种方便 class 让你的 embedded-jetty 到 运行 任意 javax.servlet.ServletContainerInitializer
没有完整的 WebApp 的所有开销和复杂的初始化过程。
CdiServletContainerInitializer
是 Jetty 提供的ServletContainerInitializer
,它在ServletContext
中设置了各种内容,以允许 Weld 将自身正确连接到ServletContext
。EnhancedListener
也是焊接提供的ServletContainerInitializer
,它在焊接 + CDI 的接线一侧。
为了提供静态文件,您需要在 ServletContextHandler
中定义一个“基本资源”,然后将 DefaultServlet
添加到 [的“默认”url-pattern =23=].
ServletContextHandler context = new ServletContextHandler();
context.setBaseResource(Resource.newResource(webRootUri));
context.addServlet(DefaultServlet.class, "/");
如果您想一起查看所有这些内容,请在
查看示例项目