我试图用Maven创建一个简单的Java Jetty/Jersey项目,并成功地让Jersey从Java类中定义的方法将内容返回给客户端。我相信我已经设置了我的Jetty服务器,这样src/main/resources
中的文件也可以通过使用WebServer.createServer
中的ServletContextHandler.setBaseResource
方法返回到客户端。但是,当我导航到其中一个文件的URL时,Jetty返回404文件未找到错误。
我对服务器设置的理解是,当发出请求时,Jersey类会检查是否有匹配的路径,如果找到了,则返回内容,如果没有匹配的路径,则搜索基本资源,如果文件与路径匹配,则返回文件。
我的Jetty服务器类位于src/main/java/WebServer.java
中,如下所示:
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;
import org.eclipse.jetty.util.resource.Resource;
import org.eclipse.jetty.util.resource.ResourceCollection;
import org.glassfish.jersey.media.multipart.MultiPartFeature;
import org.glassfish.jersey.server.ResourceConfig;
import org.glassfish.jersey.servlet.ServletContainer;
public class WebServer {
public static void main(String[] args) {
Server server = createServer();
try {
server.start();
System.out.println("Server started");
server.join();
} catch (Exception e) {
e.printStackTrace();
}
}
private static Server createServer() {
Server server = new Server(9090);
ServletContextHandler context = new ServletContextHandler(server, "/");
Resource resources = createStaticResources();
context.setBaseResource(resources);
ServletHolder servlet = createServlet();
context.addServlet(servlet, "/*");
return server;
}
private static ResourceConfig createResourceConfig() {
ResourceConfig config = new ResourceConfig();
config.packages("Controllers");
config.register(MultiPartFeature.class);
return config;
}
private static ServletHolder createServlet() {
ResourceConfig config = createResourceConfig();
ServletContainer container = new ServletContainer(config);
ServletHolder servlet = new ServletHolder(container);
return servlet;
}
private static Resource createStaticResources() {
String[] locations = new String[] {
"src/main/resources/"
};
Resource resources = new ResourceCollection(locations);
return resources;
}
}
我的Jersey处理程序类位于src/main/java/Controllers/Main.java
中,如下所示:
package Controllers;
import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;
@Path("/")
public class Main {
@GET
@Path("/")
@Produces(MediaType.TEXT_PLAIN)
public String helloWorld() {
return "Hello World!";
}
@GET
@Path("/page1")
@Produces(MediaType.TEXT_PLAIN)
public String page1() {
return "Page 1";
}
}
我在哪里误解了导致这些404错误的Jetty服务器设置?
1条答案
按热度按时间tjjdgumg1#
ServletContextHandler
本身不会提供静态文件,您需要向其添加DefaultServlet
。或者配置额外的ResourceHandler
。https://www.eclipse.org/jetty/javadoc/jetty-10/org/eclipse/jetty/servlet/DefaultServlet.html
https://www.eclipse.org/jetty/javadoc/jetty-10/org/eclipse/jetty/server/handler/ResourceHandler.html