Я хочу восстановить хост и порт сервера, на котором работает мой контейнер Jersey 2.6. Контейнер в настоящее время развернут на Tomcat 7. Однако я вынужден выпустить свое приложение, которое можно развернуть на каждом сервере, поддерживающем сервлеты Java. В данном случае это Tomcat, но решение должно быть независимым от сервера.
Я зарегистрировал класс запуска Джерси, где я хочу получить хост и порт. Однако я еще не нашел решения для получения порта.
Мой класс, который вызывается при инициализации моего сервлета из Джерси:
public class ServletInitialization extends ResourceConfig {
public ServletInitialization() {
int port = ???;
String host = InetAddress.getLocalHost().getHostName();
}
}
В своих исследованиях я нашел вопрос трехлетней давности, относящийся к той же проблеме. Принятый ответ ориентирован на кота, и я думаю, что он будет правильно работать только на коте (import org.apache.catalina.*
). Я бы не хотел изменять серверный движок, конфигурацию сервера и ничего не вводить в сервер при запуске.
Я попытался использовать простой сервлет Java, но не могу найти способ получить порт и там:
public class ServletInitializationPlain extends HttpServlet {
@Override
public void init() {
int port = ???;
}
}
Кто-нибудь знает, как получить порт из контейнера сервлета при запуске (независимо от сервера, на котором он работает)?
ИЗМЕНИТЬ
Я принял решение Steohans, но я думаю, что это довольно сложно, почему моя ServletInitialization не вызывается при запуске веб-контейнера. Потому что на самом деле ResourceConfig не является сервлетом. Я объясню этот вопрос сейчас:
Я расширил ResourceConfig.class, который является подклассом Application.class. Этот класс приложения не является расширенным сервлетом Java, а является собственным классом Джерси. Хотя приложение вызывается при запуске веб-контейнера. Однако в спецификации Джерси можно прочитать, что класс приложения должен сам обрабатываться ServletContainer.class, который является подклассом сервлета Java. Эта обработка определена в файле web.xml. И, в конце концов, здесь все является сервлетом.
Поскольку невозможно получить порт при запуске, это, конечно, возможно при отправке запроса:
@Path("example")
public class ServletMethods {
@GET
public Response example(@HeaderParam("Host") String host) {
return Response.ok(host).build();
}
}