Вы не указали, какую ошибку 404 вы получаете.
Если 404 от самой Jetty (не является частью контекста), то это контролируется Server
level ErrorHandler
.(например, запрос GET для http://<machine>/foo/bar
в вашем сценарии, поскольку "/ foo" не является частью вашего контекста "/ wac")
Если 404 из-за ошибки, которая возвращается к ServletContextHandler
тогда ваш существующий ErrorPageErrorHandler
в основном правильный.
Второй параметр в addErrorPage
- это URL-путь (относительно вашего объявленного базового ресурса), а не путь к файловой системе.
Пример (при условии, что /error.html
доступен через веб-запрос GET):
ErrorPageErrorHandler errorHandler = new ErrorPageErrorHandler();
errorHandler.addErrorPage(HttpStatus.NOT_FOUND_404, "/error.html");
context.setErrorHandler(errorHandler);
Примечание: путь URL-адреса может указывать на сервлет (ваш, jsp, конечную точку jersey и т. д.), если вы хотите, это не обязательно должен быть HTML.
Если 404 от запроса JAX-RS / Джерси, то в JAX-RS / Джерси есть специальная обработка для получения действительного ответа об ошибке 404 на основе входящегодетали запроса.
Примером может служить клиент REST, запрашивающий ресурс JSON, и Джерси, выдающий ответ 404 с телом JSON, указывающим подробности ошибки.
Другие примечания ...
DefaultServlet defaultServlet = new DefaultServlet();
ServletHolder holderPwd = new ServletHolder("default", defaultServlet);
holderPwd.setInitParameter("resourceBase", "./src/main/resources/index.html");
Не объявляйте ваш resourceBase
на вашем DefaultServlet
, объявляйтеэто в вашем ServletContextHandler
.
ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
context.setContextPath("/rac");
context.setBaseResource(Resource.newResource("/path/to/my/base/directory"));
Кроме того, resourceBase
- это полный путь к каталогу (или URI), а не файл или относительный путь.
И setWelcomeFiles
- это имена файлов или относительные пути к URL-адресам, которые следует использовать, если входящий запрос GET относится к ресурсу каталога.
Пример:
context.setWelcomeFiles(new String[] { "index.html", "welcome.html", "index.jsp" });
Чтобы запрос на http://<machine>/wac/
был полученфактически обслуживая http://<machine>/wac/index.html
(если он существует).
Это также относится к глубоким запросам к каталогам, например, http://<machine>/wac/app/deps/scripts/jquery/
приведет к обслуживанию содержимого http://<machine>/wac/app/deps/scripts/jquery/index.html