Pasar Mensajes JSF entre Redireciones

Un problema general que tiene JSF, es el pasar mensajes entre redireciones, es decir, cuando se utiliza el patrón de navegacion POST-REDIRECT-GET. Este patrón suele ocurrir cuando utilizamos en las reglas de navegacón la etiqueta <redirect> tanto en JSF como en JBoss Seam, o devolvemos directamente un view ID en un metodo action. También cuando se utiliza el parámetro faces-redirect con valor true.

Para solventar este problema, el Framework JBoss Seam, creo el componente FacesMessages de ámbito conversación, que permite pasar los mensajes entre redirecciones si estamos en la misma conversación.

El problema se presenta cuando utilizamos los métodos clickAndKillLastConversation() del componente MenuManagerBean (Estos métodos destruyen la conversación anterior y crean una nueva conversación temporal o de largo recorrido, según la confguración indicada) y además utilizamos la etiqueta <begin-conversation> en el fichero .page.xml o en la entrada de la página del fichero pages.xml tanto en la página actual como en la nueva.

En este caso podemos seguir utilizando el componente FacesMessages (en los beans de respaldo) o StatusMessages (en los servicios, PAOs o DAOs), después de la llamada al método clickAndKillLastConversation().

Sino tenemos esa posibilidad, podemos utilizar el componente MultiPageFacesMessages de ámbito sesión. Tiene los mismos métodos que el componente FacesMessages, pero no permite añadir mensajes destinados a controles JSF, solo permite mensajes globales.

Ejemplo:

package es.um.atica.prueba.backbeans;
 
import org.jboss.seam.annotations.Name;
import org.jboss.seam.core.Conversation;
import org.jboss.seam.faces.FacesMessages;
 
import es.um.atica.seam.components.MenuManagerBean;
import es.um.atica.seam.faces.MultiPageFacesMessages;
 
@Name("estadosBean")
public class EstadosBean {
 
    public String navega(String viewId) {
        MultiPageFacesMessages.instance().add( "MultiPageFacesMessages antes de kill [#0] - [#1].", viewId, Conversation.instance().getId() );
        FacesMessages.instance().add( "FacesMessages antes de kill [#0] - [#1].", viewId, Conversation.instance().getId() );
        MenuManagerBean.instance().clickAndKillLastConversation();
 
        FacesMessages.instance().add( "FacesMessages despues de kill [#0] - [#1].", viewId, Conversation.instance().getId() );
        MultiPageFacesMessages.instance().add( "MultiPageFacesMessages despues de [#0] - [#1].", viewId, Conversation.instance().getId() );
        return viewId;
    }
 
}

El resultado sería:

 Mensajes Redirect

Solo en el caso anterior, utilizaremos el nuevo componente.


JUAN MIGUEL BERNAL GONZALEZ 08/11/2019 13:48

  • fdw2.0/fundeweb2.0/gt/jsf_messages_redirects.txt
  • Última modificación: 08/11/2019 14:50
  • por JUAN MIGUEL BERNAL GONZALEZ