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 回答