У меня есть приложение Spring Boot, работающее в автономном контейнере Tomcat. Я медленно продвигаюсь к работе с глобальной обработкой ошибок (пользовательские 404 страницы и т. Д.), А класс ErrorPageFilter
теперь поймать ошибку, но она бросает NullPointerException
, пытаясь переслать запрос на ErrorPage
.Spring Boot - ErrorPageFilter не может найти RequestDispatcher
Трассировка стека выглядит следующим образом:
java.lang.NullPointerException
org.springframework.boot.context.web.ErrorPageFilter.handleErrorStatus(ErrorPageFilter.java:141)
org.springframework.boot.context.web.ErrorPageFilter.doFilter(ErrorPageFilter.java:112)
org.springframework.boot.context.web.ErrorPageFilter.access$000(ErrorPageFilter.java:59)
org.springframework.boot.context.web.ErrorPageFilter$1.doFilterInternal(ErrorPageFilter.java:88)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
org.springframework.boot.context.web.ErrorPageFilter.doFilter(ErrorPageFilter.java:101)
Глядя на источник ErrorPageFilter
по версии у меня есть, это не удается, пытаясь соответствовать RequestDispatcher
для пути ошибки:
private void handleErrorStatus(HttpServletRequest request,
HttpServletResponse response, int status, String message)
throws ServletException, IOException {
if (response.isCommitted()) {
handleCommittedResponse(request, null);
return;
}
String errorPath = getErrorPath(this.statuses, status);
if (errorPath == null) {
response.sendError(status, message);
return;
}
response.setStatus(status);
setErrorAttributes(request, status, message);
request.getRequestDispatcher(errorPath).forward(request, response);
(последняя строка является NPE)
Я настроил свою обработку ошибок следующим образом: config:
@Configuration
class ErrorConfiguration implements EmbeddedServletContainerCustomizer {
@Override public void customize(ConfigurableEmbeddedServletContainer container) {
container.addErrorPages(new ErrorPage(HttpStatus.NOT_FOUND, "/errors/404"))
container.addErrorPages(new ErrorPage(HttpStatus.INTERNAL_SERVER_ERROR, "/errors/500"))
}
}
который, кажется, хорошо - те страницы ошибок регистрируются и ErrorPageFilter
ногами в
Я попытался регистрируя путь «/ ошибки/404», как и стандартный вид-контроллер и как. @Controller
сопоставление запросов (также обратите внимание, если я просто перейду непосредственно к/errors/404 в браузере, адрес будет удален, и страница будет отображаться)
Может ли кто-нибудь пролить свет на это?