com.sun.faces.lifecycle.RestoreViewPhase.notify后的java.lang.NullPointerException而不是找不到HTTP 404页面

时间:2012-03-19 16:47:13

标签: jsf-2 http-status-code-404 facelets

我们在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)

1 个答案:

答案 0 :(得分:1)

这是早期Mojarra版本中的一个错误,当您配置了PhaseListener时,该错误会在恢复视图时执行,但UIViewRootnull。这个错误是在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>