【问题标题】:Display exception stack trace into Facelets page在 Facelets 页面中显示异常堆栈跟踪
【发布时间】:2012-08-17 14:31:21
【问题描述】:

我需要在我的 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 不工作,通过数据表进行交互也不工作。我确信发生了异常,我在我的日志文件中看到了它。

【问题讨论】:

  • 您是否尝试迭代堆栈跟踪元素?就像使用 for 和 itens 一样是 ${exception.stackTrace}?
  • 不,我没有尝试过。我现在就试试看它是否有效。谢谢。
  • 不客气!如果可行,我会发布答案;)
  • 不幸的是,这不起作用,我已经编辑了问题。
  • 我对 JSF 很生疏,但也许 只接受字符串(我真的不记得了)。试试#{exception.message} 之类的东西,看看是否生成了什么。

标签: java jsf exception jsf-2 facelets


【解决方案1】:

它以请求属性的形式出现,其名称由 RequestDispatcher.ERROR_EXCEPTION 常量指定。

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

这为您提供了整个 Exception 对象。获取它的堆栈跟踪需要更多的工作。你基本上需要create a custom EL function,它基本上是这样的:

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 showcase page

【讨论】:

  • 谢谢,它工作得很好。现在我可以看到异常,我将编写 el 函数获取完整的堆栈跟踪。再次感谢:)
猜你喜欢
  • 2010-10-16
  • 2014-01-24
  • 2011-01-05
  • 1970-01-01
  • 2017-08-09
  • 2013-12-07
相关资源
最近更新 更多