【发布时间】:2014-04-04 20:28:54
【问题描述】:
我想检索我的 Jersey 2.6 容器正在运行的服务器的主机和端口。该容器当前部署在 Tomcat 7 上。但是,我不得不发布可部署在每台支持 Java servlet 的服务器上的应用程序。在这种情况下,它是一个 Tomcat,但解决方案必须是独立于服务器的。
我已经注册了一个 Jersey 启动类,我想在其中获取主机和端口。但是,我还没有找到任何解决方案来获取端口。
我的类,在我的 Jersey servlet 初始化时调用:
public class ServletInitialization extends ResourceConfig {
public ServletInitialization() {
int port = ???;
String host = InetAddress.getLocalHost().getHostName();
}
}
在我的研究中,我发现了一个3 year old question,它指的是同样的问题。接受的答案集中在 Tomcat 上,我认为只能在 Tomcat 上正确运行(import org.apache.catalina.*)。我想避免在启动时修改服务器引擎、服务器配置或向服务器注入任何东西。
我尝试使用普通的 Java servlet,但也找不到获取端口的方法:
public class ServletInitializationPlain extends HttpServlet {
@Override
public void init() {
int port = ???;
}
}
是否有人知道如何在启动时从 servlet 容器中检索端口(独立于运行它的服务器)?
编辑
我已经接受了 steohans 解决方案,但我认为这很棘手,为什么我的 ServletInitialization 在 web 容器启动时没有被调用。因为实际上 ResourceConfig 不是 Servlet。我现在将解释这个问题:
我扩展了 ResourceConfig.class,它是 Application.class 的子类。这个 Application 类不是扩展的 Java servlet,而是 Jersey 的一个自己的类。我虽然在 Web 容器启动时调用了一个应用程序。然而,在 Jersey 规范中可以读到,Application 类本身需要由 ServletContainer.class 处理,ServletContainer.class 是 Java Servlet 的子类。 此处理在 web.xml 中定义。 最后,这里的一切都是 servlet。
由于无法在启动时获取端口,因此在分派请求时当然可以:
@Path("example")
public class ServletMethods {
@GET
public Response example(@HeaderParam("Host") String host) {
return Response.ok(host).build();
}
}
【问题讨论】:
标签: java jersey jax-rs jersey-2.0