8

JSF アプリケーションerror.xhtmlページに例外スタック トレースを表示する必要があります。JSPページでそれを行うのがいかに簡単かを知っています。しかし、JSF 2.0 には問題があります。

web.xmlはJSF 2.0 Faceletsページをエラーページとして定義しました:

<error-page>
    <exception-type>java.lang.Throwable</exception-type>
    <location>/faces/views/error.xhtml</location>
</error-page>

エラーが発生すると、このページにリダイレクトされます。必要なのは、この Facelets ページに例外のスタック トレースを表示することです。

私は使用しようとしました:

<pre>
    <h:outputText value="${exception}"/>
</pre>

しかし、出力が得られません。私はインターネットを検索してきましたが、解決策が見つかりませんでした。Facelets ページに例外スタック トレースを表示するにはどうすればよいですか?

編集:

私はちょうど試しました:

<c:forEach var="exeption" items="${exception.stackTrace}">
    <div>${exeption}</div>
</c:forEach>

<h:dataTable value="#{exception.stackTrace}"
             var="exception">
    <h:column>
        <h:outputText value="#{exception}"/>
    </h:column>
</h:dataTable>

JSTL が機能せず、データテーブルを介した対話も機能しません。例外が発生したことは確かです。ログ ファイルに表示されます。

4

1 に答える 1

16

RequestDispatcher.ERROR_EXCEPTION定数で指定された名前のリクエスト属性として存在します。

#{requestScope['javax.servlet.error.exception']}

これにより、オブジェクト全体が得られますException。そのスタックトレースを取得するには、もう少し作業が必要です。基本的に、基本的に次のようなことを行うカスタム EL 関数を作成する必要があります。

public static String printStackTrace(Throwable exception) {
    StringWriter stringWriter = new StringWriter();
    exception.printStackTrace(new PrintWriter(stringWriter, true));
    return stringWriter.toString();
}

次のように使用できるようにします。

<pre>#{my:printStackTrace(requestScope['javax.servlet.error.exception'])}</pre>

JSF ユーティリティ ライブラリOmniFacesもこれを提供します。FullAjaxExceptionHandlerショーケースページもご覧ください。

于 2012-08-17T14:58:25.830 に答える