簡體   English   中英

渲染時的jsp / spring-mvc異常 - 如何獲取自定義錯誤頁面並記錄異常

[英]jsp / spring-mvc exception on render - how to get custom error page and log the exception

如果服務或控制器中發生異常,則由Spring的HandlerExceptionResolvers處理。 但是,如果.jsp處理中存在異常(例如,即使使用JSTL也會發生PropertyNotFoundException ),則spring不會通過其異常處理機制傳遞此異常。 此外,它不被視為錯誤500,因此不考慮<error-page>配置

相反,異常將傳播到servlet容器。 這很好,但我實際上無法得到我想要的行為:

  • 顯示(500)錯誤頁面
  • 記錄異常

我目前的設置:

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

會發生什么 - 在任何地方都沒有記錄異常。 並且未顯示錯誤頁面。 相反,請求的頁面顯示為半渲染。 如果我增加緩沖區大小(足以到達有問題的代碼段),則只顯示錯誤頁面。 (再次,沒有記錄)

那么,我如何實現我想要的目標呢? 不改變緩沖區大小,不使用<c:catch> ,並且在錯誤頁面中沒有ex.printStackTrace()

將其添加到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中一直在為我工作。

你可以使用具有空preHandle()postHandle()HandlerInterceptor ,但是它適用於afterComplete()異常嗎?

好像有兩個問題:

  1. 您可以直接在JSP中設置緩沖區大小以避免半渲染; 因為你已經設置了isErrorPage這將遵循你當前的設計
  2. 根據此示例 ,您可以從500頁面記錄錯誤

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM