如何使用嵌入式码头设置上下文路径?
How do I set a context path with embedded 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 {
任何帮助将不胜感激,因为我觉得我被困在一码线上了。
为什么要 Jersey 提供静态内容?
这不是 JAX-B 服务器的作用。
做什么...
- 从
WebAppContext
切换到 ServletContextHandler
(您不需要 WebAppContext
的开销或完全成熟的 [=10] 的任何字节码扫描或注释扫描部署技术=] 带来 table.
- 防止 Jersey 提供静态内容。
- 设置正确的 ResourceBase - 使用完全限定的路径或 URI(无相对路径,无部分 URI)
- 在默认 url-pattern
"/"
上添加一个 DefaultServlet
命名为 "default"
.
Jetty 将从您的资源库中为静态内容提供哪些更改。
Jetty 端配置和 DefaultServlet 用法的一些先前answers/examples:
- Serving static files from alternate path in embedded Jetty
- Display static HTML file from resources folder in Jetty Serverlet doGet method
关于如何将 Jersey 配置为不提供静态内容的答案有很多。
我最喜欢的一个解决方案是...
- Servlet for serving static content
我正在用头撞墙。我写了一个微型嵌入式码头服务器(码头 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 {
任何帮助将不胜感激,因为我觉得我被困在一码线上了。
为什么要 Jersey 提供静态内容?
这不是 JAX-B 服务器的作用。
做什么...
- 从
WebAppContext
切换到ServletContextHandler
(您不需要WebAppContext
的开销或完全成熟的 [=10] 的任何字节码扫描或注释扫描部署技术=] 带来 table. - 防止 Jersey 提供静态内容。
- 设置正确的 ResourceBase - 使用完全限定的路径或 URI(无相对路径,无部分 URI)
- 在默认 url-pattern
"/"
上添加一个DefaultServlet
命名为"default"
.
Jetty 将从您的资源库中为静态内容提供哪些更改。
Jetty 端配置和 DefaultServlet 用法的一些先前answers/examples:
- Serving static files from alternate path in embedded Jetty
- Display static HTML file from resources folder in Jetty Serverlet doGet method
关于如何将 Jersey 配置为不提供静态内容的答案有很多。
我最喜欢的一个解决方案是...
- Servlet for serving static content