Как мне установить контекстный путь со встроенным причалом? - PullRequest
0 голосов
/ 01 июня 2019

Я бьюсь головой об стену от этого. Я написал крошечный встроенный сервер Jetty (Jetty 9.4.18, Jersey 1.19.4), и я не могу на всю жизнь заставить его соблюдать контекстный путь и развернуть мои службы REST.

Я попробовал setContextPath, но он никогда не работал на ServletContextHandler, поэтому я выбрал WebAppContext.

Это так просто, как я могу это понять:

Server jettyServer = new Server(9999);

// set up the web app
WebAppContext webapp = new WebAppContext();
webapp.setContextPath("/app/");
webapp.setResourceBase("web");

jettyServer.setHandler(webapp);

// add REST service
ServletHolder jerseyServlet = webapp.addServlet(ServletContainer.class, "/service/*");
final ResourceConfig resourceConfig = new ResourceConfig(RestService.class);
resourceConfig.register(MultiPartFeature.class);
jerseyServlet.setInitParameter("jersey.config.server.provider.packages", "org.futureboy.app.server.rest");

try {
    jettyServer.start();
    jettyServer.join();
} catch (Exception e) {
    e.printStackTrace();
    //jettyServer.stop();
    jettyServer.destroy();
}

Статические файлы HTML хранятся в каталоге web, и это прекрасно работает, если я сохраню эту строку следующим образом:

ServletHolder jerseyServlet = webapp.addServlet(ServletContainer.class, "/service/*");

Однако это означает, что служба REST (которая работает в / app / service) не работает. Если я поменяю эту строку:

ServletHolder jerseyServlet = webapp.addServlet(ServletContainer.class, "/*");

Тогда служба REST работает нормально, но теперь статический HTML-контент НЕ работает нормально. Поэтому я либо получаю работающий статический HTML-сервис на /app/, либо работающий REST-сервис под /app/service, но у меня не может быть обоих. Что я делаю неправильно? Файл RestService.java начинается как:

@Path("/service")
public class RestService {

Буду признателен за любую помощь, потому что я чувствую, что застрял здесь на линии в один ярд.

1 Ответ

1 голос
/ 01 июня 2019

Почему вы хотите, чтобы Джерси обслуживал статический контент?

Это не роль сервера JAX-B.

Что делать ...

  1. Переключение с WebAppContext на ServletContextHandler (вам не нужны служебные данные WebAppContext или какие-либо из методов развертывания сканирования байт-кода или развертывания аннотаций, которые WebAppContext вносит в таблицу.
  2. Запретить использование Джерси статического контента.
  3. Настройка правильной ResourceBase - используйте полный путь или URI (без относительных путей, без частичных URI)
  4. Добавить DefaultServlet к шаблону URL по умолчанию "/" с именем "default".

Какие из этих изменений Jetty будет обслуживать статическим контентом из вашей Ресурсной базы.

Некоторые предыдущие ответы / примеры конфигурации на стороне Jetty и использования DefaultServlet:

И есть много ответов о том, как настроить Джерси, чтобы он не обслуживал статический контент.

Одним из моих любимых решений является решение, предоставленное на ...

...