Встроенный веб-сервер 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.

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


person Mike Stoddart    schedule 21.03.2016    source источник
comment
каково значение HTTP_PATH ?   -  person Joakim Erdfelt    schedule 21.03.2016
comment
О, спасибо, я отредактировал исходный код примера. Это /сессия.   -  person Mike Stoddart    schedule 21.03.2016
comment
Ваш пример кода работает как есть. В этом нет ничего плохого.   -  person Joakim Erdfelt    schedule 22.03.2016
comment
Я тоже так думал, за исключением того, что я никогда не попадал в точку останова в обработчике, и он не отображал вывод отладки. Мне нужно будет получить и опубликовать версию Jetty.   -  person Mike Stoddart    schedule 22.03.2016
comment
Я добавил версии Jetty и Java JDK в исходный пост. Спасибо.   -  person Mike Stoddart    schedule 22.03.2016
comment
Я попробовал пример OneContext из wiki.eclipse.org/Jetty/Tutorial/Embedding_Jetty, но я все еще получаю ту же проблему. Обработчик никогда не вызывается.   -  person Mike Stoddart    schedule 22.03.2016
comment
Если я отправлю запрос на localhost:9995/session/1, будет вызван обработчик, и целью будет / 1. Может быть, я просто не понимаю, как работают пути ContextHandler.   -  person Mike Stoddart    schedule 22.03.2016
comment
Извините, что добавляю комментарии, но я подумал, что читателям может быть интересно увидеть мой прогресс. Запрос localhost:9995/session вызывает обработчик, но не localhost:9995/session. Не обращайте внимания на точку с запятой — сайт добавляет ее без видимой причины.   -  person Mike Stoddart    schedule 22.03.2016
comment
Я могу выполнить свои требования, используя HttpServlet вместо AbstractHandler, поэтому я думаю, что переключусь. У меня это уже работает. Спасибо.   -  person Mike Stoddart    schedule 22.03.2016
comment
У меня точно такая же проблема с Jetty v9.4.0.v20161208. Вы когда-нибудь находили решение для этого @MikeStoddart?   -  person Carlos Silva    schedule 21.12.2016
comment
@CarlosSilva, извини, я так не думал.   -  person Mike Stoddart    schedule 22.12.2016
comment
Я понял это и добавил ответ ниже, если вам все еще интересно @MikeStoddart.   -  person Carlos Silva    schedule 29.01.2017


Ответы (1)


У меня была точно такая же проблема, и это просто неправильное понимание того, как работает Jetty API. Я ожидал использовать ContextHandlers как минимальную реализацию служб REST, однако ContextHandlers предназначены для обработки запросов ко всей базе контекста (например, http://server:80/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();
person Carlos Silva    schedule 29.01.2017