Spring 启动 - ErrorPageFilter 找不到 RequestDispatcher
Spring Boot - ErrorPageFilter cannot find RequestDispatcher
我在一个独立的 Tomcat 容器中有一个 Spring 启动应用程序 运行 - 我在让全局错误处理工作(自定义 404 页面等)方面一直在慢慢取得进展),并且 ErrorPageFilter
class 现在正在捕获错误,但它抛出一个 NullPointerException
试图将请求转发给 ErrorPage
.
堆栈跟踪如下:
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[=11=]0(ErrorPageFilter.java:59)
org.springframework.boot.context.web.ErrorPageFilter.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)
我的错误处理配置如下,错误配置:
@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
正在启动。
我已经尝试将路径“/errors/404”注册为标准视图控制器和 @Controller
请求映射(另请注意,如果我直接转到 /errors/404在浏览器中 url 已解析并显示页面)
任何人都可以阐明这一点吗?
这是我的错误 - 是因为 web.xml 被意外删除 - 因此 RequestDispatcher 不可用。
添加 web.xml 解决了这个问题。
类似于行为:
Tomcat unable to find jsp in war file
Spring MVC - Could not get RequestDispatcher
我在一个独立的 Tomcat 容器中有一个 Spring 启动应用程序 运行 - 我在让全局错误处理工作(自定义 404 页面等)方面一直在慢慢取得进展),并且 ErrorPageFilter
class 现在正在捕获错误,但它抛出一个 NullPointerException
试图将请求转发给 ErrorPage
.
堆栈跟踪如下:
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[=11=]0(ErrorPageFilter.java:59)
org.springframework.boot.context.web.ErrorPageFilter.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)
我的错误处理配置如下,错误配置:
@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
正在启动。
我已经尝试将路径“/errors/404”注册为标准视图控制器和 @Controller
请求映射(另请注意,如果我直接转到 /errors/404在浏览器中 url 已解析并显示页面)
任何人都可以阐明这一点吗?
这是我的错误 - 是因为 web.xml 被意外删除 - 因此 RequestDispatcher 不可用。
添加 web.xml 解决了这个问题。
类似于行为:
Tomcat unable to find jsp in war file
Spring MVC - Could not get RequestDispatcher