我们在weblogic10.3中使用JSF2.0.2,我们正在处理带有404错误页面的web.xml中的FileNotFound或Page Not Found。
webapp->
folder-a->page1.xhtml
page2.xhtml
如果我们请求的页面不是内部文件夹-a,例如page3.xhtml,那么它不会被web.xml 404捕获,而是落入JSF层并导致以下异常。
java.lang.NullPointerException
at com.sun.faces.lifecycle.RestoreViewPhase.notifyAfter(RestoreViewPhase.java:297)
at com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:110)
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:114)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:308)
答案 0 :(得分:1)
这是早期Mojarra版本中的一个错误,当您配置了PhaseListener
时,该错误会在恢复视图时执行,但UIViewRoot
为null
。这个错误是在Mojarra 2.0.4中引入的,并且已被报告为issue 1764,并且根据报告已经修复了Mojarra版本2.1.0(根据源代码为2.0.6)。因此,升级到至少该版本应解决该问题。
升级Mojarra之后,你会遇到另一个问题。当找不到视图时,Mojarra不发送404,而是抛出com.sun.faces.context.FacesFileNotFoundException
,它是java.io.FileNotFoundException
的子类。所以这最终会成为HTTP 500响应。因此,如果您在错误代码404上配置了错误页面,那么它根本不会显示,而是将显示错误代码为500的错误页面或异常类型上最接近的匹配。您需要按如下方式配置错误页面:
<error-page>
<exception-type>com.sun.faces.context.FacesFileNotFoundException</exception-type>
<location>/errors/404.xhtml</location>
</error-page>
或者如果你不想成为JSF实现依赖
<error-page>
<exception-type>java.io.FileNotFoundException</exception-type>
<location>/errors/404.xhtml</location>
</error-page>