Встроенный веб-сервер Jetty не работает, обработчик не вызывается

Я пытаюсь встроить Jetty 8 (8.1.18.v20150929) в приложение Java (jdk1.7.0_67). У меня есть следующий код:

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

Мой обработчик довольно прост в тесте:

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

Если я запускаю приложение и затем использую CURL для отправки запроса GET на http://localhost:9995/session, то оно возвращает состояние 200, но отладочных данных нет.

Если я http://localhost:9995/session2, я получаю ошибку 404.

Я прочитал много примеров в Интернете, но по какой-то причине я не могу заставить обработчик работать должным образом. Я делаю что-то неправильно? Спасибо

1 ответ

У меня была точно такая же проблема, и это просто недоразумение о том, как работает Jetty API. Я ожидал использовать ContextHandlers как минимальную реализацию служб REST, однако ContextHandlers предназначены для обработки запросов ко всей базе контекста (например, http://server/context-base, то есть эквивалент приложения в Tomcat), Правильный способ решить этот вопрос - использовать сервлеты:

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();
Другие вопросы по тегам