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