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を実行しようとしていfacesContext.getViewRoot().getViewId()ますが、その NPE で失敗します。

<error-page>カスタム 404 エラー ページがある場合は、サーブレット フィルターを使用するか、単に を使用して処理することをお勧めします。

したがって、次のいずれかでマップされているフィルタでFacesServlet:

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

これは、サーバーのデフォルトの HTTP 404 エラー ページ、または 404 の任意のカスタムで終了します。OmniFaces<error-page>そのようなフィルターがあります。<error-code>

またはの一致で。<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 に答える