首先,您需要将Grizzly配置为Servlet容器。这不是默认行为。您只是创建了一个HTTP服务器。因此,您需要的第一件事是Grizzly servlet依赖项。
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-grizzly2-servlet</artifactId>
<version>${jersey2.version}</version>
</dependency>
这里是相关内容的解释。使用这个工件时,你需要使用
GrizzlyWebContainerFactory
替代 Grizzly
HttpServer
和
GrizzlyHttpServerFactory
。唯一的问题是,如果你查看工厂 API 方法,实际上没有地方可以注册任何监听器,并且经过我的测试,
@WebListener
注释不会自动被捕获。我们需要访问 Grizzly
WebAppContext
,Jersey 使用它来创建 Grizzly servlet 容器。
我能让它工作的方法,就是从
GrizzlyWebContainerFactory.create
源代码中获取一些代码,然后自己创建容器。这不需要太多的代码。大部分源代码都进行了检查,以便于实现通用性。但在单个使用情况下(没有初始化参数),你可以将代码减少到这个程度。
private static HttpServer create(URI u, Servlet servlet) throws IOException {
String path = u.getPath();
path = String.format("/%s", UriComponent.decodePath(u.getPath(), true)
.get(1).toString());
WebappContext context = new WebappContext("GrizzlyContext", path);
context.addListener(MyListener.class);
ServletRegistration registration;
registration = context.addServlet(servlet.getClass().getName(), servlet);
registration.addMapping("/*");
HttpServer server = GrizzlyHttpServerFactory.createHttpServer(u);
context.deploy(server);
return server;
}
然后只需调用 HttpServer server = create(BASE_URI, new ServletContainer(resourceConfig));
作为附注,针对你的使用情况(我刚重新阅读了问题:-),Jersey还有
Event Listeners。你可以编写一个
ApplicationEventListener
并监听销毁事件,在那里处理所有操作。