【问题标题】:REST and static content in jetty server码头服务器中的 REST 和静态内容
【发布时间】: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);

可以不那么冗长吗?

【问题讨论】:

    标签: java rest jersey jetty


    【解决方案1】:

    您的服务器类只有一个用于静态内容的处理程序。你需要一个额外的处理 JSON 的东西。这必须分配给处理程序列表。

    例如

        HandlerList handlers = new HandlerList();
        handlers.setHandlers(new Handler[] { jsonRessourcehandler, servletContextHandler, new DefaultHandler() });
        server.setHandler(handlers);
    

    还提供类似 json 的内容,您可以适当地搜索 JERSEY 库/示例

    【讨论】:

    • 谢谢你,这有帮助,请参阅我编辑的帖子 - 虽然我可以为两者使用一个处理程序,但显然不是。看起来很冗长 - 可以更简单地完成吗(如更少的代码行)?
    • 我认为您不需要自己的 RessourceHandler 实现。你也可以看看我自己的一些问题stackoverflow.com/questions/37188585/…
    猜你喜欢
    • 2014-01-22
    • 2011-11-06
    • 2021-08-05
    • 2013-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-18
    • 1970-01-01
    相关资源
    最近更新 更多