【问题标题】:Blank Page in JSFJSF 中的空白页
【发布时间】:2008-09-23 20:55:05
【问题描述】:

如果我的代码抛出异常,有时 - 不是每次 - jsf 会显示一个空白页面。我正在使用 facelets 进行布局。 这个Sun forumn´s post 报告了类似的错误,但没有答案。 其他人有同样的问题,或者有解决方案吗? ;)

由于一些要求。以下是更多数据:

web.xml

 <error-page>
        <exception-type>com.company.ApplicationResourceException</exception-type>
        <location>/error.faces</location>
 </error-page>

并且真正异常之后打印jsf相关的栈:

####<Sep 23, 2008 5:42:55 PM GMT-03:00> <Error> <HTTP> <comp141> <AdminServer> <[ACTIVE] ExecuteThread: '3' for queue: 'weblogic.kernel.Default (self-tuning)'> <<WLS Kernel>> <> <> <1222202575662> <BEA-101107> <[weblogic.servlet.internal.WebAppServletContext@6d46b9 - appName: 'ControlPanelEAR', name: 'ControlPanelWeb', context-path: '/Web'] Problem occurred while serving the error page.
javax.servlet.ServletException: viewId:/error.xhtml - View /error.xhtml could not be restored.
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:249)
    at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:226)
    at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:124)
    at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:283)
    at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:175)
    at weblogic.servlet.internal.RequestDispatcherImpl.invokeServlet(RequestDispatcherImpl.java:525)
    at weblogic.servlet.internal.RequestDispatcherImpl.forward(RequestDispatcherImpl.java:261)
    at weblogic.servlet.internal.ForwardAction.run(ForwardAction.java:22)
    at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
    at weblogic.security.service.SecurityManager.runAs(Unknown Source)
    at weblogic.servlet.internal.ErrorManager.handleException(ErrorManager.java:144)
    at weblogic.servlet.internal.WebAppServletContext.handleThrowableFromInvocation(WebAppServletContext.java:2201)
    at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2053)
    at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1366)
    at weblogic.work.ExecuteThread.execute(ExecuteThread.java:200)
    at weblogic.work.ExecuteThread.run(ExecuteThread.java:172)
javax.faces.application.ViewExpiredException: viewId:/error.xhtml - View /error.xhtml could not be restored.
    at com.sun.faces.lifecycle.RestoreViewPhase.execute(RestoreViewPhase.java:180)
    at com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:248)
    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:117)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:244)
    at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:226)
    at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:124)

我正在使用 jsf 版本 Mojarra 1.2_09richfaces 3.2.1.GAfacelets 1.1.13

希望有帮助:(

【问题讨论】:

  • 您介意给我们提供更多细节吗?您正在使用什么实现以及您的错误处理系统是如何配置的。
  • 我重新编辑了这个问题。请看一下。 ;)

标签: java jsf facelets


【解决方案1】:

我认为这在很大程度上取决于您的 JSF 实现。我听说有些会呈现空白屏幕。

我们使用的那个会抛出带有堆栈跟踪的错误 500。其他超时按钮不会对用户没有任何错误。这都是在我们的开发阶段。

但我能给你的最好建议是捕获异常并将它们记录在错误日志中,这样你就有堆栈跟踪以供以后调试。对于后端失败等我们无能为力的消息,我们只需向 FacesContext 添加一条致命消息,该消息将显示在屏幕上并记录堆栈跟踪。

【讨论】:

  • 感谢您的回答。其实挺难过的。我们已经在遵循很好的建议,但问题仍然存在。关键是要抓住一切来避免这种行为。 :( 谢谢。
  • 好吧,我在我的应用程序中看到有时页面加载为空白。原因被发现是因为在我的应用程序中的 bg 活动中打开了太多文件,并且文件流没有被关闭一些地方。
【解决方案2】:

我今天在我的error.jsp 页面中修复了一个类似的问题。这不会与您的完全相同,但如果某人遇到类似问题,它可能会为他们指明正确的方向。我的问题似乎来自两个不同的来源。

首先,message 异常属性未在某些抛出由错误页面捕获的异常的 servlet 中设置。 servlet 使用 ServletException(Throwable rootCause) 构造函数捕获并重新抛出异常。

其次,在错误页面本身,原作者使用脚本代码来解析消息,使用String.split(message, ";");,因为消息是null,所以失败了。我在错误日志中收到了 NullPointerException,以及消息“提供错误页面时出现问题。”

这两件事结合在一起,在引发原始异常的 servlet 的 URL 处为我提供了一个空白页面。当我使用ServletException(String message, Throwable rootCause) 构造函数在我的servlet 中重新引发异常时,我通过提供我自己的错误消息来解决我的问题,因此错误消息将不再是null。我还使用 EL 而不是 scriptlet 代码重写了 error.jsp 页面,但这并不是绝对必要的。

【讨论】:

    【解决方案3】:

    对于 JSF 2 上的空白页,在 ExceptionHandlerWrapper.handle 或覆盖此方法的类中放置断点。在我的情况下,这是由于自定义代码过于严格并且没有记录错误。

    【讨论】:

    • 我为搜索后登陆这里的人写了这篇文章,2012 年他们可能正在使用 JSF 2。这就是我指定它适用于 JSF 2 的原因。但无论如何感谢您的反对...跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-24
    • 2019-06-21
    • 2012-08-09
    • 2015-01-20
    • 1970-01-01
    • 2012-11-09
    • 1970-01-01
    相关资源
    最近更新 更多