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 >>

Este sitio utiliza cookies.    Leer más