我的春天MVC Web應用程序有它一個可摺疊的堆棧跟蹤元素(顯然是一個開發/調試選項)一個錯誤頁面。這用於正常工作,並從控制器(或有時來自JSP引擎)顯示適當的堆棧跟蹤。JSP錯誤頁面產生一個JSP錯誤
Q:是否有可能有一個JSP是一個錯誤頁面,或者它應該是靜態的HTML?
Q:我在做什麼錯?
的一連串事件是由我的web.xml中定義的錯誤處理程序驅動的(我認爲):
<error-page>
<exception-type>java.lang.Throwable</exception-type>
<location>/view/errors/internalError.jsp</location>
</error-page>
沿途某處(切換到Maven構建系統,升級的碼頭,和春季2.5 - > 3.0),我注意到這個錯誤頁面停止了以前的工作方式。它renderes一個問題是相同的 - 異常堆棧軌跡顯示是不從控制器拋出的異常,但是從錯誤頁面本身!
javax.servlet.ServletException: javax.servlet.jsp.JspTagException:
500 /WEB-INF/jsp/admin/errors/internalError.jsp
at org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:862)
at org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:791)
at org.apache.jsp.WEB_002dINF.jsp.admin.defaultParent_jsp._jspService(defaultParent_jsp.java:225)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
什麼似乎是這裏發生的,是下面的事件鏈:
- 春季控制器點擊未捕獲的異常:
throw new RuntimeException("no bananas")
- 此異常由彈簧底座的MultiActionController(因爲沒有自定義抓錯誤處理程序是爲此頁面定義的)重新引發異常:僅在Spring的DispatcherServlet中才會被捕獲。
- 然後DispatcherServlet查看一些東西(可能是我的web.xml),以發現異常類型的錯誤頁面:
- Spring然後將此URL解析爲視圖(以及我的錯誤JSP)並嘗試呈現它。
- 現在,這裏出問題時默認父JSP(見下面),拋出一個異常JSP其被捕後,這一次,由碼頭的ServletHolder。這個異常現在被映射(通過web.xml)到錯誤的JSP頁面。
- 在這裏,您可能會認爲這會導致無限循環。但是,第二次的事情就會很好地發生,並且會導致JSP錯誤。
JSP引擎似乎在呈現默認父JSP時就死了 - 它似乎遇到了問題:org.apache.taglibs.standard.tag.common.core.ImportSupport
。我看過一些網絡帖子,人們說它必須處理來自WEB-INF目錄的導入。
// disallow inappropriate response codes per JSTL spec
if (irw.getStatus() < 200 || irw.getStatus() > 299) {
throw new JspTagException(irw.getStatus() + " " + stripSession(targetUrl));
}
雖然它看起來像任何HTTP 500錯誤會打破它。但是,這不是什麼錯誤頁應該有什麼?
哇,它驚人的你能夠從我的帖子中得知它。這正是我正在做的。 – Justin 2011-03-02 00:43:28
這完全解決了它,所有頁面的默認父項不必要地使用了。我仍然不明白爲什麼從錯誤頁面的錯誤顯示正確..因爲,它也使用默認的父母。 –
Justin
2011-03-02 03:21:22
不客氣。 – BalusC 2011-03-02 03:21:47