如何使用嵌入式码头设置上下文路径?



我把头撞在墙上。我写了一个小型嵌入式码头服务器(码头 9.4.18,泽西岛 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 内容无法正常工作。所以我要么在/app/上得到一个工作的静态HTML服务,要么在/app/service下面得到一个有效的REST服务,但我不能两者兼而有之。我做错了什么?RestService.java 文件启动如下:

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

任何帮助将不胜感激,因为我觉得我被困在这里的一码线上。

为什么您希望泽西岛提供静态内容?

这不是 JAX-B 服务器的角色。

怎么办...

  1. WebAppContext切换到ServletContextHandler(您不需要WebAppContext的开销,也不需要全面的WebAppContext带来的任何字节码扫描或注释扫描部署技术的开销。
  2. 阻止泽西岛投放静态内容。
  3. 设置适当的资源库 - 使用完全限定的路径或 URI(无相对路径,无部分 URI)
  4. 在默认 url 模式"/"上添加一个名为"default"DefaultServlet

这些更改 Jetty 将从您的资源库中提供静态内容。

Jetty 侧配置和 DefaultServlet 用法的一些先前答案/示例:

  • 通过.jar部署 Jetty 服务器。为什么我无法访问索引?
  • 如何从 Jar 获取嵌入式 Jetty 提供 html 文件,而不是战争
  • 从嵌入式 Jetty 中的备用路径提供静态文件
  • 使用 Jetty 嵌入式容器时,ServletContextHandler.setResourceBase 和 ResourceHandler.setResourceBase 有什么区别?
  • 码头:默认的 servlet 上下文路径
  • 显示 Jetty Serverlet doGet 方法中资源文件夹中的静态 HTML 文件

关于如何将 Jersey 配置为不提供静态内容,有很多答案。

我最喜欢的一个是提供的解决方案...

  • 用于提供静态内容的 Servlet

最新更新