Handling ViewExpiredException depending on the current view

user1234 picture user1234 · Sep 27, 2011 · Viewed 7.8k times · Source

I am using JSF 2.0 and Primefaces in my project.

I have two xhtml pages namely Cars.xhtml and Bikes.xhtml.

I am using ViewScoped backing beans.

Currently If get view expired exception from any of the two pages,im handling it in the web.xml. through the error-page tag and directing to welcome.xhtml.

Now If i get a viewexpired exception from Bikes.xhtml I need to direct to another page which is BikesHome.xhtml instead of welcome.xhtml.

If the exception is from Cars.xhtml, welcome.xhtml should be shown.

Please help me how to do.

Answer

Bhesh Gurung picture Bhesh Gurung · Sep 27, 2011

I not 100% sure about this (because I haven't tried it myself) but here is my suggestion for - Check this out Dealing Gracefully with ViewExpiredException in JSF2.

if (t instanceof ViewExpiredException) {
    ViewExpiredException vee = (ViewExpiredException) t;

At this point you can get the view id as follows -

vee.getViewId();

And then based on the view id do the desired navigation.

NavigationHandler nh = facesContext.getApplication().getNavigationHandler();
//check condition, set view       
nv.handleNavigation(facesContext, null, "/view-id?faces-redirect=true");
facesContext.renderResponse();

Or, I think you could also do -

FacesContext.getExternalContext().redirect(url);
FacesContext.responseComplete();

to redirect.