Встроенная пристань не загружает контейнер сервлета или сервлет-джерси. Я могу загрузить любой из них, но не оба - PullRequest
0 голосов
/ 25 апреля 2019

У меня встроенный причал с контейнером из джерси.Я проверяю, могу ли я отправиться в / hello, чтобы прочитать мой сервлет, который может запросить диспетчеризацию, и еще один URL / / entry / test, чтобы перейти в мой класс точки входа.Только один из них работает в зависимости от того, какой обработчик был добавлен последним.

Я пытался обосновать подобное: встроенный сервер Jetty не запускает ни сервлет, ни веб-приложение

ServletContextHandler contextHandler = new ServletContextHandler(
    ServletContextHandler.SESSIONS);
contextHandler.setContextPath("/*");

Server jettyServer = new Server(8980);

WebAppContext webappcontext = new WebAppContext();
File warPath = new File( System.getProperty("user.dir"), "src/main/resources");
webappcontext.setWar(warPath.getAbsolutePath());

webappcontext.setInitParameter("org.eclipse.jetty.servlet.Default.dirAllowed",
    "false");
webappcontext.addServlet(new ServletHolder(new MyServlet()), "/hello");


ServletHolder jerseyServlet = contextHandler.addServlet(
     org.glassfish.jersey.servlet.ServletContainer.class, "/*");
jerseyServlet.setInitOrder(0);

jerseyServlet.setInitParameter( "jersey.config.server.provider.classnames",
     EntryPoint.class.getCanonicalName());

HandlerList handlerCollection = new HandlerList();
//handlerCollection.setHandlers(new Handler[] { contextHandler,webappcontext });
handlerCollection.setHandlers(new Handler[] { webappcontext,contextHandler }); 


// Based on which handler was added last, i am able to view /hello or /entry/test

jettyServer.setHandler(handlerCollection);

try {
    jettyServer.start();
    jettyServer.join();
} finally {
    jettyServer.destroy();
}

/ hello для отображения страницы моего сервлета и / entry/ test для просмотра содержимого класса точки входа

1 Ответ

0 голосов
/ 25 апреля 2019

Нет необходимости смешивать WebAppContext и ServletContextHandler в вашей ситуации.

Используйте одно или другое.

  • Используйте WebAppContext, если у вас есть официальная WARфайл с (необязательно) WEB-INF/web.xml.Используйте, если вам нужно иметь во время выполнения проверку ваших классов на байт-код / ​​аннотацию (для таких вещей, как @WebServlet).
  • Используйте ServletContextHandler, если вы вручную декларируете сервлеты (как в настоящее время).

Кроме того, не используйте шаблон URL "/*" в конфигурации Джерси, это в значительной степени означает, что Джерси будет принимать запросы.Разделите Джерси на свой собственный шаблон URL, если можете.Обычный подход заключается в том, чтобы "/api/*" обрабатывался Джерси, а остальное обрабатывалось всем, что вы хотите использовать в контейнере сервлетов.Если вы воспользуетесь этим подходом, убедитесь, что у вас есть четкое представление о том, как спецификация Servlet работает с контекстными путями, шаблонами URL, спецификациями путей, информацией о путях и т. Д., Поскольку это поможет вам правильно ориентироваться в конфигурации Jersey.

Пример того, что у вас есть, но с использованием только ServletContextHandler

Server jettyServer = new Server(8980);

ServletContextHandler contextHandler = new ServletContextHandler(
        ServletContextHandler.SESSIONS);
// Context-paths are not patterns, they are prefixes
contextHandler.setContextPath("/");

// Setup where static files are found
File warPath = new File(System.getProperty("user.dir"), "src/main/resources");
Resource warResource = new PathResource(warPath);
contextHandler.setBaseResource(warResource);

// Add your Jersey setup
// BWEE! BWEE! do not use "/*" for your url-pattern, if you want to do things
// in your servlet container that is not Jersey.
String jerseyUrlPattern = "/api/*";
ServletHolder jerseyServlet = contextHandler.addServlet(
        org.glassfish.jersey.servlet.ServletContainer.class, jerseyUrlPattern);
jerseyServlet.setInitOrder(0);

jerseyServlet.setInitParameter("jersey.config.server.provider.classnames",
        EntryPoint.class.getCanonicalName());

// Add your custom Servlets
contextHandler.addServlet(MyServlet.class, "/hello");

// Add DefaultServlet to serve static files (servlet spec requirement)
// always added last in your ServletContext.
// always named "default" for this specific servlet setup (per spec)
ServletHolder defaultHolder = new ServletHolder("default", DefaultServlet.class);
defaultHolder.setInitParameter("dirAllowed", "true");
// always at url-pattern "/" for this specific servlet (per spec)
contextHandler.addServlet(defaultHolder, "/");

HandlerList handlers = new HandlerList();
handlers.addHandler(contextHandler);
handlers.addHandler(new DefaultHandler()); // used to show config errors

jettyServer.setHandler(handlers);

try
{
    jettyServer.start();
    jettyServer.join();
}
finally
{
    jettyServer.stop(); // use STOP not .destroy()
}
...