2016-03-21 10 views
1

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

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

Что такое значение 'HTTP_PATH'? –

+0

О, спасибо, я отредактировал источник примера. Это «/ session». –

+0

Ваш пример кода работает как есть. В этом нет ничего плохого. –

ответ

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