En cierta aplicación cuyo nombre no quiero pronunciar, pero que usa JSF 2 con Seam 3, estamos utilizando org.jboss.seam.international.status.Messages para desplegar mensajes de error
@Inject private Messages mensajes; //... mensajes.error("hay el terrible de error!");
El caso es que también estamos manejando las excpeciones con el ¿interceptor?-o lo que sea de Seam para redirigir a ciertas páginas en caso de excpeción, por ejemplo, al login por fin de sesión.
@SessionScoped @HandlesExcpetions public class ExceptionManager{ @Inject private Messages mensajero; @Inject private FacesContext ctx; //... void finSesion(@Handles CaughtException<ViewExpiredException> evt){ this.mensajero.warn("mojón de acequia, se te acabo la sesión"); this.ctx.getExgternalContext().redirect("login.xhtml"); evt.handled(); }
lo cual, evidentemente, no funciona.
Por lo que entiendo, ésto se debería a que los mensajes sólo duran un request, y que al hacer una redirección ésto se considera un segundo request >> (la respuesta original desapareció…).
En versiones anteriores de JSF, la solución hubiese requerido un PhaseListener como éste >> pero en JSF2 podemos usar el objeto Flash – similar al de Rails, vive de un request para el otro.
@SessionScoped @HandlesExcpetions public class ExceptionManager{ @Inject private FacesContext ctx; @Inject private Flash flashGordon; //... void finSesion(@Handles CaughtException<ViewExpiredException> evt){ this.flashGordon.setKeepMessages(true);//recordará los mensajes hasta el próximo request FacesMessage msg = new FacesMessage("mojón de acequia, se te acabo la sesión");//los mensajes de Seam no se pasan por FacesContext msg.setSeverity(FacesMessage.SEVERITY_WARN); this.ctx.addMessage(null, mensaje); thi.s.ctx..getExgternalContext().redirect("login.xhtml"); evt.handled(); }
Y ahora funciona.
Eso sí, todavía hay bugs en cuanto al lifecycle >> – quizás de mi versión de Mojarra (2.0.3) – y la redirección por
thi.s.ctx..getExgternalContext().redirect("login.xhtml");
sólo está funcionando si la ruta a la que redirigimos está a la misma ‘altura’ que la página actual.
A modo de documentación, cómo se hacía en versiones anteriores de JSF >>