渲染时的jsp / spring-mvc异常 - 如何获取自定义错误页面并记录异常

时间:2011-09-20 21:32:07

标签: java jsp tomcat servlets spring-mvc

如果服务或控制器中发生异常,则由spring的HandlerExceptionResolvers处理。但是,如果.jsp处理中存在异常(例如 - PropertyNotFoundException,即使使用JSTL也会发生),则spring不会通过其异常处理机制传递此异常。此外,它不被视为错误500,因此不考虑<error-page>配置

相反,异常传播到servlet容器。这很好,但我实际上无法得到我想要的行为:

  • 显示(500)错误页面
  • 记录例外

我目前的设置:

  • 500.jsp有isErrorPage=true
  • 所有jsps都包含一个公共文件,其中包含<%@ page errorPage="500.jsp" %>

会发生什么 - 在任何地方都没有记录异常。并且未显示错误页面。相反,请求的页面显示为半渲染。如果我增加缓冲区大小(足以到达有问题的代码段),则只显示错误页面。 (再次,没有记录)

那么,我如何实现我的目标呢?在不更改缓冲区大小的情况下,在错误页面中不使用<c:catch>且不使用ex.printStackTrace()

3 个答案:

答案 0 :(得分:2)

将此添加到web.xml:

<servlet>
  <servlet-name>ErrorServlet</servlet-name>
  <servlet-class>package.of.ErrorServlet</servlet-class>
</servlet>

<servlet-mapping>
  <servlet-name>ErrorServlet</servlet-name>
  <url-pattern>/WEB-INF/servlets/error</url-pattern>
</servlet-mapping>

<error-page>
  <exception-type>java.lang.Throwable</exception-type>
  <location>/WEB-INF/servlets/error</location>
</error-page>

在ErrorServlet实现doService方法中,因为servlet容器将在那里转发任何当前操作(GET,POST等)。

添加此辅助方法

    public static < T extends Throwable > T getExceptionFromRequest (
            final Class< T > exception_class,
            final HttpServletRequest request                
        )
    {
        final T ret_val =
            exception_class.cast(
                request.getAttribute( SERVLET_EXCEPTION_ATTR )
            );

        if ( ret_val != null )
        {
            return ret_val;
        }

        return
            exception_class.cast(
                request.getAttribute( JSP_EXCEPTION_ATTR )
            );
    }

这两个常数:

    public final static String SERVLET_EXCEPTION_ATTR =
        "javax.servlet.error.exception";

    public final static String JSP_EXCEPTION_ATTR =
        "javax.servlet.jsp.jspException";

这在Tomcat中一直在为我工作。

答案 1 :(得分:1)

您是否可以使用preHandle()postHandle()为空的HandlerInterceptor,但是在afterComplete()中是否符合例外?

答案 2 :(得分:0)

似乎有两个问题:

  1. 您可以直接在JSP中设置缓冲区大小以避免半渲染;因为您已经设置isErrorPage,这将遵循您当前的设计
  2. 您可以在500页as per this example
  3. 中记录错误