嵌入式码头不加载 servlet 或 jersey servlet container.I 能够加载其中一个但不能同时加载

Embedded jetty not loading servlet or jersey servlet container.I am able to load either of them but not both

我是 运行 带有球衣容器的嵌入式码头。我正在测试我是否可以前往 '/hello' 来读取我的 servlet,它可以请求调度和另一个 url '/entry/test' 来进入我的入口点 class。其中只有一个基于最后添加的处理程序工作。

我试图推理出类似于:embedded jetty server does not run both servlet and webapp

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 显示我的 servlet 页面和 /entry/test 查看入口点 class 内容

根据您的情况,无需混用 WebAppContextServletContextHandler

使用其中之一。

  • 如果你有一个正式的 WAR 文件,使用 WebAppContext,带有(可选)WEB-INF/web.xml。如果您需要运行时 bytecode/annotation 扫描您的 类(例如 @WebServlet),请使用。
  • 如果您手动声明 Servlet(就像您现在这样),请使用 ServletContextHandler

此外,不要在 Jersey 配置中使用 url 模式 "/*",这几乎意味着 Jersey 将接受请求。如果可以的话,将泽西岛分成它自己的 url 模式。一种常见的方法是让 "/api/*" 由 Jersey 处理,其余的由你想在 Servlet 容器中使用的任何东西处理。如果您采用这种方法,请确保您充分了解 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()
}