2011-02-28 19 views
9

tengo lo que supongo que es un problema común: algunos bean administrado tiene una acción que añade algunos mensajes al contexto:La preservación FacesMessage después de redirección para su presentación a través <h:message> en JSF

FacesMessage fm = new FacesMessage("didn't work"); 
fm.setSeverity(FacesMessage.SEVERITY_ERROR); 
FacesContext.getCurrentInstance().addMessage(null, fm); 
return "some-outcome"; 

Entonces el mapa los resultados de faces-config.xml y configurarlo para

<navigation-case> 
    <from-outcome>some-outcome</from-outcome> 
    <to-view-id>/view.xhtml</to-view-id> 
    <redirect/> 
</navigation-case> 

En view.xhtml presento el mensaje:

<h:message globalsOnly="true" /> 

Sin embargo, no funciona porque el mensaje se pierde cuando se ejecuta la redirección.

¿Cómo lo resolvería? Encontré esto amazing post explicando cómo hacerlo usando un PhaseListener pero creo que esta situación es demasiado común como para tener que ser resuelto de esta manera. ¿Me equivoco? ¿Debo crear el PhaseListener? ¿O hay alguna otra solución estándar?

+5

¿Dónde está la respuesta @BalusC? – brandizzi

+4

Um .... no se puede leer el código en la "publicación increíble". Además no puede encontrar la respuesta @BalusC. –

+0

@JoshuaDavis Recuerdo que BalusC ha publicado una buena respuesta. En realidad, he marcado esta respuesta como * la * respuesta. Me pregunto qué pasó ... – brandizzi

Respuesta

6

¡Gran respuesta de BalusC como de costumbre!

Solo quiero agregar, cuando utilicé su código para establecer la propiedad keepMessages, no se configuró para la sesión, sino solo para esta solicitud (a pesar de lo que dice en los Javadocs).

puse el código siguiente en mi header.xhtml <c:set target="#{flash}" property="keepMessages" value="true" />

Ahora funciona en todas las páginas, sin que tenga que establecerlo cada vez que lo necesite en el bean de respaldo. Es necesario JSTL para esto y no se olvide de poner el siguiente en su cabecera XHTML: xmlns:c="http://java.sun.com/jsp/jstl/core"

+1

Creo que este es el enlace para la publicación de BalusC: http://balusc.blogspot.com/2007/03/post-redirect-get-pattern.html – seanf

2

JSF 2,2

En el frijol:

FacesContext facesContext = FacesContext.getCurrentInstance(); 
Flash flash = facesContext.getExternalContext().getFlash(); 
flash.setKeepMessages(true); 
facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "yourMessage", null)); 
return "namePage?faces-redirect=true"; 

En el namePage

Cambio

<h:message globalsOnly="true" /> 

a

<h:messages globalsOnly="true" /> 
Cuestiones relacionadas