JSF 2.0 Custom Exception Handler - ViewHandler not redirected in Weld application

I use Ed Burns proposed a special exception handler to display the error page whenever a specific exception occurs. I am also trying to show an error page when the context is inactive. However, this part (line 45./46.) Causes problems:

nav.handleNavigation(fc, null, "viewExpired"); fc.renderResponse(); 

Here's the full CustomExceptionHandler (properly configured as Ed Burns says on his blog)

 package com.sun.faces; import java.util.Iterator; import java.util.Map; import javax.enterprise.context.ContextNotActiveException; import javax.faces.FacesException; import javax.faces.application.NavigationHandler; import javax.faces.application.ViewExpiredException; import javax.faces.component.UIViewRoot; import javax.faces.context.ExceptionHandler; import javax.faces.context.ExceptionHandlerWrapper; import javax.faces.context.FacesContext; import javax.faces.event.ExceptionQueuedEvent; import javax.faces.event.ExceptionQueuedEventContext; public class ViewExpiredExceptionExceptionHandler extends ExceptionHandlerWrapper { private ExceptionHandler wrapped; public ViewExpiredExceptionExceptionHandler(ExceptionHandler wrapped) { this.wrapped = wrapped; } @Override public ExceptionHandler getWrapped() { return this.wrapped; } @Override public void handle() throws FacesException { for (Iterator<ExceptionQueuedEvent> i = getUnhandledExceptionQueuedEvents().iterator(); i.hasNext();) { ExceptionQueuedEvent event = i.next(); ExceptionQueuedEventContext context = (ExceptionQueuedEventContext) event.getSource(); Throwable t = context.getException(); if (t instanceof ViewExpiredException) { ViewExpiredException vee = (ViewExpiredException) t; FacesContext fc = FacesContext.getCurrentInstance(); Map<String, Object> requestMap = fc.getExternalContext().getRequestMap(); NavigationHandler nav = fc.getApplication().getNavigationHandler(); try { // Push some useful stuff to the request scope for // use in the page requestMap.put("currentViewId", vee.getViewId()); nav.handleNavigation(fc, null, "viewExpired"); fc.renderResponse(); } finally { i.remove(); } } if (t instanceof ContextNotActiveException) { FacesContext fc = FacesContext.getCurrentInstance(); NavigationHandler nav = fc.getApplication().getNavigationHandler(); try { nav.handleNavigation(fc, null, "contextNotActive"); fc.renderResponse(); } finally { i.remove(); } } } // At this point, the queue will not contain any exceptions I want to handle (for now). // Therefore, let the parent handle them. getWrapped().handle(); } } 

However, I always get a "view failed" listing in the console. So why is this not displaying this error page. I assume this is caused by an inactive context (which is used by the NavigationHandler)!

Can anyone confirm this behavior?

PS: I am using Weld 1.1 with Mojarra 2.0.4

+4
source share
1 answer

I think you need to add a navigation rule to the faces-config.xml file, something like this:

  <navigation-rule> <from-view-id>*</from-view-id> <navigation-case> <from-outcome>contextNotActive</from-outcome> <to-view-id>/contextNotActive.xhtml</to-view-id> </navigation-case> </navigation-rule> 
0
source