简体   繁体   中英

REST and static content in jetty server

I would like to have an (embedded) jetty+jersey server which provides the REST api (GET and POST on the "/resource" route) but also serves some static content (index.html, bundle.js on the "/"). I can only get the /resource part to work - GET/POST tested with curl ie

curl -X POST -H 'Content-Type: application/json' -d '{"resource":"FOOBAR"}' http://localhost:8080/resource

However the "/" path returns 404 with this setup:

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();
        }

    }

Paths:

@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();
    }

}

And Resource class for completeness:

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;
    }

}

Edited per answer below by 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);

Can it be done less verbose?

your class for the server has only one handler for the static content. You would need an additional handler for the JSON stuff. This has to be than assigned to the handler list.

eg

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

also to provide something like json you properly want to search for JERSEY library/examples

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM