gpt4 book ai didi

java - 为 Jersey 注册上下文监听器

转载 作者:行者123 更新时间:2023-11-30 10:48:15 24 4
gpt4 key购买 nike

我需要在关闭 Jersey 服务器后执行一些清理步骤。在我看来,这可以通过实现 ServletContextListener 轻松实现。 .问题当然是如何将这个监听器添加到应用程序中。我已经看到在文件 web.xml 中完成此操作的示例,如下所示:

<listener>
<listener-class>org.SomeCompany.SomePackage.server.MyListener</listener-class>
</listener>

MyListener 类如下所示:

@WebListener
public class MyListener implements ServletContextListener {

问题是这种方法只适用于部署为 war 文件。然而,我也将我的软件作为一个独立的 jar 文件发布,它创建了一个 Grizzly Web 服务器来部署 servlet:

HttpServer httpServer = GrizzlyHttpServerFactory.createHttpServer(BASE_URI,
new MyServerConfig());

MyServerConfig 类是 ResourceConfig 的子类并使用各种 register 方法。我也想以编程方式添加监听器,但调用 register 似乎无法完成这项工作。有什么解决办法吗?

最佳答案

首先,您需要将 Grizzly 配置为 servlet 容器。这不是默认行为。您只是在创建一个 HTTP 服务器。因此,您需要做的第一件事就是依赖 Grizzly servlet

<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-grizzly2-servlet</artifactId>
<version>${jersey2.version}</version>
</dependency>

所以这是处理这个问题的方法。使用此工件,而不是使用 GrizzlyHttpServerFactory 的 Grizzly HttpServer,您可以使用 GrizzlyWebContainerFactory .唯一的问题是,如果您查看工厂 API 方法,确实没有地方可以注册任何监听器,而且根据我的测试,@WebListener 注释不会自动被拾取。我们需要访问的是 Jersey 用来创建 Grizzly servlet 容器的 Grizzly WebAppContext

我让它工作的方法就是从 GrizzlyWebContainerFactory.create source code 中获取一些代码,然后自己创建容器。代码真的不多。大多数源代码都会进行检查,因为它需要通用。但是在单个用例中(没有 init-params),您几乎可以将代码缩减为这样

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 并监听 destroy 事件,并在那里进行所有处理。

关于java - 为 Jersey 注册上下文监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35871573/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com