Нет необходимости смешивать 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()
}