2

私の 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)

ここで起こっているように見えるのは、次の一連のイベントです。

  1. Spring コントローラーがキャッチされていない例外にヒットします。throw new RuntimeException("no bananas")
  2. この例外は、Spring ベースの MultiActionController によってキャッチされます (このページにはカスタム エラー ハンドラーが定義されていないため) 例外が再スローされます。Spring の DispatcherServlet によって再度キャッチされるだけです。
  3. 次に、DispatcherServlet は何か (おそらく私の web.xml) を調べて、例外のタイプに適したエラー ページを見つけます。
  4. 次に、Spring はこの URL をビュー (およびエラー JSP) に解決し、レンダリングを試みます。
  5. ここで、デフォルトの親 jsp (* 以下を参照) で問題が発生し、今回は jetty の ServletHolder によってキャッチされる JSP 例外がスローされます。この例外は、(web.xml を介して) エラー JSP ページにマップされるようになりました。
  6. ここで、無限ループになると思うかもしれません。ただし、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 エラーが発生すると壊れてしまうように見えますが。しかし、それはページにあるはずのエラーではありませんか?

4

1 に答える 1

2

Q: JSP をエラー ページにすることは可能ですか、それとも静的 HTML にする必要がありますか?

全然大丈夫です。サーブレットなどでもかまいません。もちろん、バグがない限り。

Q: 何が間違っていますか?

エラー ページにバグがあります。<c:import>からのフラグメントを含めるためにエラーページ内で使用しているようです/WEB-INF。これは公開リソースではないため、許可されていません (正直なところ、古い JSTL バージョンで機能したことは思い出せません)。むしろ使用して<jsp:include>ください。

于 2011-03-01T23:53:48.170 に答える