0

我们有一个自定义的 JSF2 异常处理程序......

  Iterator<ExceptionQueuedEvent> i = getUnhandledExceptionQueuedEvents().iterator();
        boolean isUnHandledException = false;
        SystemException se = null;
        while(i.hasNext()) {
            ExceptionQueuedEvent event = (ExceptionQueuedEvent)i.next();
            ExceptionQueuedEventContext context = (ExceptionQueuedEventContext)event.getSource();
            Throwable t = context.getException();
                    try {
                             if (apperror)
                                  take to app error page
                             if (filenotfound)
                                  take to page not found error page
                  }catch(){
                  } finally {
                    i.remove ().....causes problem....in filenot found...
..... 
                  }

应用程序异常处理工作正常,没有任何问题。

但是我们自定义处理程序中的 FileNotFound 会导致问题。异常处理程序捕获 FileNotFound ,但是在尝试删除 queuedevent i.remove 时会导致 NullPointerException ,如果我评论 i.remove 它工作正常...

java.lang.NullPointerException
    at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:96)
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
    at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:594)
    at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227)
    at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125)
4

1 回答 1

1

这不是处理FileNotFoundException来自 Mojarra 的完全正确的地方。那就没有办法了UIViewRoot。第 96 行RenderResponsePhase尝试执行 a facesContext.getViewRoot().getViewId(),但该 NPE 失败。

最好使用 servlet 过滤器来处理它,或者<error-page>如果您有自定义 404 错误页面,则只需使用它。

因此,无论是在映射到的过滤器中FacesServlet

try {
    chain.doFilter(request, response);
}
catch (FileNotFoundException e) {
    response.sendError(HttpServletResponse.SC_NOT_FOUND, request.getRequestURI());
}

然后,这将出现在服务器的默认 HTTP 404 错误页面中,或者任何<error-page>带有<error-code>404的自定义页面中。OmniFaces也有这样的过滤器

在匹配中。<error-page>_web.xml<exception-type>FileNotFoundException

<error-page>
    <exception-type>java.io.FileNotFoundException</exception-type>
    <location>/WEB-INF/errorpages/404.xhtml</location>
</error-page>
于 2012-05-02T20:07:49.390 回答