嵌入式码头不装载 servlet 或 jersey servlet 容器.我可以加载其中任何一个,但不能同时加载它们中的



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

我试图推理类似于:嵌入式码头服务器不能同时运行servlet和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 查看入口点类内容

没有必要在你的情况下混合WebAppContextServletContextHandler

使用其中之一。

  • 如果您有正式的 WAR 文件,请使用WebAppContext,并带有(可选)WEB-INF/web.xml。 如果您需要对类进行运行时字节码/注释扫描(例如@WebServlet)。
  • 如果您手动声明 Servlets(就像您现在一样),请使用ServletContextHandler

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

最新更新