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

时间:2019-05-31 21:59:51

标签: jersey jetty

我正在把头撞在墙上。我写了一个微型嵌入式码头服务器(jetty 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 {

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

1 个答案:

答案 0 :(得分:1)

为什么要让Jersey提供静态内容?

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

做什么...

  1. WebAppContext切换到ServletContextHandler(您不需要WebAppContext的开销,也不需要任何WebAppContext的字节码扫描或注释扫描部署技术带到桌子上。
  2. 防止提供静态内容的球衣。
  3. 设置适当的ResourceBase-使用完全限定的路径或URI(没有相对路径,没有部分URI)
  4. 在名为DefaultServlet的默认网址格式"/"上添加一个"default"

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

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

关于如何配置Jersey不提供静态内容的答案很多。

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