Spring Boot - ErrorPageFilter找不到RequestDispatcher

时间:2015-01-27 10:35:24

标签: java spring spring-mvc spring-boot

我在一个独立的Tomcat容器中运行一个Spring Boot应用程序 - 我已经慢慢地在使全局错误处理工作(自定义404页面等)方面取得了进展,ErrorPageFilter类现在正在捕获错误,但它会引发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$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)

我已按如下方式配置错误处理,错误配置:

@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)网址已解析并显示页面

任何人都可以对此有所了解吗?

1 个答案:

答案 0 :(得分:0)

这是我的错误 - 是因为web.xml被意外删除而引起的 - 所以RequestDispatcher不可用。

添加web.xml解决了这个问题。

与行为类似:

Tomcat unable to find jsp in war file

Spring MVC - Could not get RequestDispatcher