简体   繁体   中英

Embedded Jetty web server not working, handler not invoked

I'm trying to embed Jetty 8 (8.1.18.v20150929) into a Java (jdk1.7.0_67) application. I have the following code:

    public static final String HTTP_PATH = "/session";
    public static final int HTTP_PORT = 9995;
        // Open the HTTP server for listening to requests.
    logger.info("Starting HTTP server, Port: " + HTTP_PORT + ", Path: "
            + "/session");
    httpServer = new Server();
    SelectChannelConnector connector = new SelectChannelConnector();
    connector.setPort(HTTP_PORT);
    connector.setHost("localhost");
    httpServer.addConnector(connector);
    TestHttpHandler handler = new TestHttpHandler(this);
    ContextHandler ch = new ContextHandler();
    ch.setContextPath(HTTP_PATH);
    ch.setHandler(handler);
    httpServer.setHandler(ch);

    try {
        httpServer.start();
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

My handler is pretty basic as a test:

    public void handle(String target, Request baseRequest,
        HttpServletRequest request, HttpServletResponse response)
        throws IOException, ServletException {
    logger.debug("Handling");
}

If I run the app and then use CURL to send a GET request to http://localhost:9995/session , then it returns a 200 status but there's no debug output.

If I access http://localhost:9995/session2 , I get a 404 error.

I've read many examples online but for some reason I can't seem to get the handler to work properly. Am I doing something wrong? Thanks

I had exactly the same problem, and this is just a misunderstanding about how the Jetty API works. I was expecting to use ContextHandlers as a minimal implementation of REST services, however ContextHandlers are meant to handle requests to an entire context base (for example http://server:80/context-base , ie the equivalent of an app in Tomcat). The correct way to solve this question is to use Servlets:

Server server = new Server(9995);
ServletContextHandler root = new ServletContextHandler(ServletContextHandler.NO_SECURITY | ServletContextHandler.NO_SESSIONS);
root.setContextPath("/");
ServletHolder holder = new ServletHolder(new HttpServlet() {
    public void doGet(HttpServletRequest req, HttpServletResponse resp) {
        logger.debug("Handling");
    }
});
server.start();
server.join();

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