如果我的代码抛出异常,有时 - 不是每次 - 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_09
,richfaces 3.2.1.GA
和facelets 1.1.13
。
希望得到一些帮助:(
答案 0 :(得分:2)
我认为这在很大程度上取决于您的JSF实现。我听说有些会渲染出空白屏幕。
我们使用的那个将使用堆栈跟踪抛出错误500。其他时间按钮不会在没有任何错误的情况下工作。这一切都在我们的开发阶段。
但我能给你的最好建议是捕获异常并将它们记录在错误日志中,这样你就可以在以后进行调试。对于我们无法做任何事情的消息,如后端失败,我们只会向FacesContext添加一条致命消息,该消息将显示在屏幕上并记录堆栈跟踪。
答案 1 :(得分:1)
我今天在error.jsp
页面修复了类似的问题。这与你的不完全相同,但如果他们遇到类似的问题,可能会指向正确的方向。我的问题似乎来自两个不同的来源。
首先,在一些抛出错误页面捕获的异常的servlet中没有设置message
异常属性。 servlet使用ServletException(Throwable rootCause)
构造函数捕获并重新抛出异常。
其次,在错误页面本身中,原作者使用scriptlet代码使用String.split(message, ";");
来解析消息。由于消息为null
,因此失败。我在错误日志中收到NullPointerException
,并显示“提供错误页面时出现问题。”
这两件事合起来给我一个空白页面,它在抛出原始异常的servlet的URL上。当我使用ServletException(String message, Throwable rootCause)
构造函数在我的servlet中重新抛出异常时,我通过提供自己的错误消息来修复我的问题,因此错误消息将不再是null
。我还使用EL而不是scriptlet代码重写了error.jsp
页面,但这并不是绝对必要的。
答案 2 :(得分:-1)
对于JSF 2上的空白页面,在ExceptionHandlerWrapper.handle
中放置一个断点或者覆盖此方法的类。在我的情况下,这是由于自定义代码太严格,并且没有记录错误。