java.lang.NullPointerException at com.sun.faces.lifecycle.RestoreViewPhase.notifyAfter вместо HTTP 404 страница не найдена - PullRequest
2 голосов
/ 19 марта 2012

Мы используем JSF2.0.2 в weblogic10.3, мы обрабатываем FileNotFound или Page Not Found в web.xml со страницей ошибки 404.

          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 Ответ

1 голос
/ 19 марта 2012

Это ошибка в ранней версии Mojarra, которая возникает, когда вы настроили PhaseListener, который должен выполняться при восстановлении вида, но UIViewRoot равен null. Эта ошибка была введена в Mojarra 2.0.4 и была зарегистрирована как выпуск 1764 и исправлена ​​с версии 2.1.0 Mojarra согласно отчету (и 2.0.6 согласно исходному коду). Таким образом, обновление хотя бы до этой версии должно решить эту проблему.

После того, как вы обновите Моджарру, вы столкнетесь с другой проблемой. Мохарра не отправляет 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>
...