带有欢迎文件的嵌入式 Jetty REST 服务
Embedded Jetty REST service with Welcome File
我正在尝试创建一个具有 REST API 并且可以提供静态 html 等文档的 Web 服务。目前我的 REST (Jersey 2.17) api 工作正常,但我正在努力提供资源,例如我的 index.html
项目结构
src
--main
----java
------resource
--------RestResource.java
------app
--------LocalRunner.java
----webapp
------index.html
LocalRunner.java
public class LocalRunner {
private final Server server;
public LocalRunner() {
server = new Server(8315);
}
public void start() throws Exception {
// REST
WebAppContext restHandler = new WebAppContext();
restHandler.setResourceBase("./");
restHandler.setClassLoader(Thread.currentThread().getContextClassLoader());
ServletHolder restServlet = restHandler.addServlet(ServletContainer.class, "/rest/*");
restServlet.setInitOrder(0);
restServlet.setInitParameter(ServerProperties.PROVIDER_PACKAGES, "resource");
// Web
ResourceHandler webHandler = new ResourceHandler();
webHandler.setResourceBase("./");
webHandler.setWelcomeFiles(new String[]{"index.html"});
// Server
HandlerCollection handlers = new HandlerCollection();
handlers.addHandler(restHandler);
handlers.addHandler(webHandler);
server.setHandler(handlers);
server.start();
}
public static void main(String[] args) throws Exception {
new LocalRunner().start();
}
}
点击 localhost:8315/rest/someRestEndpoint
工作正常,但如果我尝试只点击 localhost:8315
,当我期待我的 index.html
欢迎文件时,我会得到一个目录结构。我究竟做错了什么?
请注意,我没有使用 WEB.XML,因为我正在尝试执行上述 class 中的所有配置。
依赖如果有帮助(Gradle)
def jettyVersion = '7.2.2.v20101205';
compile "org.eclipse.jetty:jetty-server:${jettyVersion}"
compile "org.eclipse.jetty:jetty-webapp:${jettyVersion}"
compile "org.eclipse.jetty:jetty-servlet:${jettyVersion}"
def jerseyVersion = '2.17'
compile "org.glassfish.jersey.core:jersey-server:${jerseyVersion}"
compile "org.glassfish.jersey.containers:jersey-container-servlet-core:${jerseyVersion}"
事实证明,请求是按照处理程序添加到集合中的顺序分派给处理程序的,restHandler
一定是将响应设置为完成。因此,请求从未到达 webHandler
,欢迎文件也从未添加到响应中。此外,ResourceHandler
正在寻找 index.html 的基本目录,将 resourceBase
设置为 src/main/webapp
修复了此问题。
我正在尝试创建一个具有 REST API 并且可以提供静态 html 等文档的 Web 服务。目前我的 REST (Jersey 2.17) api 工作正常,但我正在努力提供资源,例如我的 index.html
项目结构
src
--main
----java
------resource
--------RestResource.java
------app
--------LocalRunner.java
----webapp
------index.html
LocalRunner.java
public class LocalRunner {
private final Server server;
public LocalRunner() {
server = new Server(8315);
}
public void start() throws Exception {
// REST
WebAppContext restHandler = new WebAppContext();
restHandler.setResourceBase("./");
restHandler.setClassLoader(Thread.currentThread().getContextClassLoader());
ServletHolder restServlet = restHandler.addServlet(ServletContainer.class, "/rest/*");
restServlet.setInitOrder(0);
restServlet.setInitParameter(ServerProperties.PROVIDER_PACKAGES, "resource");
// Web
ResourceHandler webHandler = new ResourceHandler();
webHandler.setResourceBase("./");
webHandler.setWelcomeFiles(new String[]{"index.html"});
// Server
HandlerCollection handlers = new HandlerCollection();
handlers.addHandler(restHandler);
handlers.addHandler(webHandler);
server.setHandler(handlers);
server.start();
}
public static void main(String[] args) throws Exception {
new LocalRunner().start();
}
}
点击 localhost:8315/rest/someRestEndpoint
工作正常,但如果我尝试只点击 localhost:8315
,当我期待我的 index.html
欢迎文件时,我会得到一个目录结构。我究竟做错了什么?
请注意,我没有使用 WEB.XML,因为我正在尝试执行上述 class 中的所有配置。
依赖如果有帮助(Gradle)
def jettyVersion = '7.2.2.v20101205';
compile "org.eclipse.jetty:jetty-server:${jettyVersion}"
compile "org.eclipse.jetty:jetty-webapp:${jettyVersion}"
compile "org.eclipse.jetty:jetty-servlet:${jettyVersion}"
def jerseyVersion = '2.17'
compile "org.glassfish.jersey.core:jersey-server:${jerseyVersion}"
compile "org.glassfish.jersey.containers:jersey-container-servlet-core:${jerseyVersion}"
事实证明,请求是按照处理程序添加到集合中的顺序分派给处理程序的,restHandler
一定是将响应设置为完成。因此,请求从未到达 webHandler
,欢迎文件也从未添加到响应中。此外,ResourceHandler
正在寻找 index.html 的基本目录,将 resourceBase
设置为 src/main/webapp
修复了此问题。