[英]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容器。 這很好,但我實際上無法得到我想要的行為:
我目前的設置:
isErrorPage=true
<%@ 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()
異常嗎?
好像有兩個問題:
isErrorPage
這將遵循你當前的設計
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.