【发布时间】:2016-05-18 07:33:29
【问题描述】:
我想要一个(嵌入式)jetty+jersey 服务器,它提供 REST api(“/resource” 路由上的 GET 和 POST)但也提供一些静态内容(index.html、bundle.js 在“ /")。我只能让 /resource 部分工作 - 使用 curl 测试 GET/POST,即
curl -X POST -H 'Content-Type: application/json' -d '{"resource":"FOOBAR"}' http://localhost:8080/resource
但是,“/”路径在此设置下返回 404:
public static void main(String[] args) {
Server jettyServer = new Server(8080);
ResourceConfig rc = new ResourceConfig();
JSONResource resource = new JSONResource();
rc.register(resource);
ServletContainer sc = new ServletContainer(rc);
ServletHolder servletHolder = new ServletHolder(sc);
// ServletHolder servletHolder = new ServletHolder("default", new DefaultServlet());
// static content
servletHolder.setInitParameter("resourceBase", "./src/webapp/");
ServletContextHandler context = new ServletContextHandler();
context.addServlet(servletHolder, "/*");
jettyServer.setHandler(context);
try {
jettyServer.start();
jettyServer.join();
} catch (Exception e) {
e.printStackTrace();
} finally {
jettyServer.destroy();
}
}
路径:
@Path("/resource")
public class JSONResource {
Resource resource = Resource.getInstance();
@GET
@Produces(MediaType.APPLICATION_JSON)
public String getStringResource() {
return this.resource;
}
@POST
@Consumes(MediaType.APPLICATION_JSON)
public Response putStringResource(Resource json) {
this.resource.setResource(json.getResource());
return Response.status(Status.OK).entity(json).build();
}
}
和资源类的完整性:
public class Resource {
private String resource = "";
private Resource() {
}
private static class Holder {
private static final Resource INSTANCE = new Resource();
}
public static Resource getInstance() {
return Holder.INSTANCE;
}
public String getResource() {
return resource;
}
public void setResource(String resource) {
this.resource = resource;
}
@Override
public String toString() {
return resource;
}
}
由user3732793按以下答案编辑
// ---JSON RESOURCE---//
JSONResource resource = new JSONResource();
ResourceConfig rc = new ResourceConfig();
rc.register(resource);
ServletContainer sc = new ServletContainer(rc);
ServletHolder servletHolder = new ServletHolder(sc);
ServletContextHandler jsonResourceContext = new ServletContextHandler();
jsonResourceContext.addServlet(servletHolder, "/*");
// ---STATIC RESOURCE---//
ResourceHandler staticResourceHandler = new ResourceHandler();
staticResourceHandler.setResourceBase("./src/webapp/");
ContextHandler staticContextHandler = new ContextHandler("/");
staticContextHandler.setHandler(staticResourceHandler);
// ---ADD HANDLERS---//
HandlerList handlers = new HandlerList();
handlers.setHandlers(new Handler[] { jsonResourceContext, //
staticContextHandler, //
new DefaultHandler() //
});
jettyServer.setHandler(handlers);
可以不那么冗长吗?
【问题讨论】: