私の spring-mvc Web アプリケーションには、折りたたみ可能なスタック トレース要素 (明らかに開発/デバッグ オプション) を含むエラー ページがあります。これは以前は正常に機能し、コントローラー (または場合によっては 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 ビルド システムに切り替え、jetty をアップグレードし、Spring 2.5 -> 3.0)、このエラー ページが以前のように機能しなくなったことに気付きました。1 つの問題で同じことがレンダリングされます。表示される例外スタック トレースは、コントローラーでスローされた例外からではなく、エラー ページ自体からのものです。
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)
ここで起こっているように見えるのは、次の一連のイベントです。
- Spring コントローラーがキャッチされていない例外にヒットします。
throw new RuntimeException("no bananas")
- この例外は、Spring ベースの MultiActionController によってキャッチされます (このページにはカスタム エラー ハンドラーが定義されていないため) 例外が再スローされます。Spring の DispatcherServlet によって再度キャッチされるだけです。
- 次に、DispatcherServlet は何か (おそらく私の web.xml) を調べて、例外のタイプに適したエラー ページを見つけます。
- 次に、Spring はこの URL をビュー (およびエラー JSP) に解決し、レンダリングを試みます。
- ここで、デフォルトの親 jsp (* 以下を参照) で問題が発生し、今回は jetty の ServletHolder によってキャッチされる JSP 例外がスローされます。この例外は、(web.xml を介して) エラー JSP ページにマップされるようになりました。
- ここで、無限ループになると思うかもしれません。ただし、2 回目は問題なく動作し、JSP エラーが表示されます。
デフォルトの親 JSP をレンダリングするときに JSP エンジンが停止しているようですorg.apache.taglibs.standard.tag.common.core.ImportSupport
。WEB-INF ディレクトリからのインポートに関係しているという Web 投稿を見たことがあります。
// disallow inappropriate response codes per JSTL spec
if (irw.getStatus() < 200 || irw.getStatus() > 299) {
throw new JspTagException(irw.getStatus() + " " + stripSession(targetUrl));
}
ここでは、HTTP 500 エラーが発生すると壊れてしまうように見えますが。しかし、それはページにあるはずのエラーではありませんか?