2010-07-27 23 views
9

Tengo una página que hace algo y cuando el usuario hace clic en un botón, se redirige al usuario a otra página y se muestra un mensaje. Aquí está mi código:Eliminación de mensajes JSF del flash

public String confirm() { 
    FacesContext context = FacesContext.getCurrentInstance(); 
    Flash flash = context.getExternalContext().getFlash(); 
    flash.setKeepMessages(true); 
    FacesMessage msg = new FacesMessage("Succesful", "Release is confirmed!"); 
    context.addMessage(null, msg); 
    return "/prot/expert/releases?faces-redirect=true"; 
} 

utilizo un p: componente gruñido que muestra mi mensaje en la página "libera". Hasta aquí todo bien.

Pero luego en cualquier página posterior que tenga p: growl (o si voy a otra página y regreso) el mensaje se muestra una y otra vez y no puedo matarlo.

he intentado algo así como:

<c:set target="#{flash}" property="keepMessages" value="false" /> 

en la página que tiene el p: gruñido, he intentado despejar el flash de la bean de respaldo, etc.

El mensaje se conserva y se muestra de nuevo . Si elimino flash.setKeepMessages (true); del código anterior, entonces no se muestra nada.

¿Qué estoy haciendo mal?

+0

Eso es extraño, estoy haciendo casi exactamente lo mismo, pero mostrando el mensaje usando una etiqueta h: messages en lugar de una etiqueta p: growl. El mensaje salió como esperaba para mí.¿Puede intentar usar h: messages, solo para ver si funciona? –

+1

Hm, ahora está funcionando. Excepto cuando el usuario presiona el botón Atrás, se muestra el mensaje, pero supongo que es un comportamiento normal. ¿Intenta configurar flash.setKeepMessages() en falso en la segunda página? – egbokul

+1

Hay un problema de JIRA abierto para esto: http://java.net/jira/browse/JAVASERVERFACES-1751 no puede creer que esto todavía esté abierto, ya que rompe por completo la funcionalidad del alcance de flash. – akira

Respuesta

7

Obtuve exactamente el mismo problema en JBoss AS 6 con Mojarra 2.0.3 y Mojarra 2.1.1. El flash debe sobrevivir a una sola redirección, pero en la práctica no siempre lo hace.

En un método de acción Tengo básicamente el mismo código:

// [add global faces message] 
FacesContext.getCurrentInstance().getExternalContext().getFlash().setKeepMessages(true); 
return "/someView.xhtml?faces-redirect=true"; 

que he estado viendo tres síntomas del problema:

  1. Después de hacer una devolución de datos en someView, el flash se enfrenta mensaje sigue apareciendo
  2. Después de una solicitud limpia a una página completamente diferente, también se muestra el mensaje de la cara
  3. Después de volver a pasar por el código que se suma el mensaje caras, obtendrá dos de los mismos mensajes en someView

Número 2 se puede explicar por darse cuenta de que el alcance del flash es de galletas con base (por lo menos en Mojarra). Relativamente pocas personas parecen entender el problema inherente con eso. Encontré esta pregunta relacionada, pero no tiene respuesta: Is Flash scope free of race conditions?

Además, cuando trato de reproducir el problema, tengo aproximadamente 2/3 posibilidades de reproducirlo. A veces, de hecho, solo sobrevive a una sola redirección, a veces se va después de algunas actualizaciones (¿por tiempo, más o menos?) Y, a veces, simplemente se queda y la única manera de deshacerse de él es reiniciar el servidor (!).

¿Tal vez estoy haciendo algo mal en alguna parte?

Observando las galletas están estableciendo, me di cuenta de la siguiente manera:

Tras activar inicialmente la acción que hace la redirección:

POST Response 
Set-Cookie csfcfc=_50Xfr 

GET Response 
Set-Cookie csfcfc=50Xfn_51Xfn 

Lo que hay que notar aquí es que la respuesta de la petición GET de el redireccionamiento nuevamente establece una cookie. Usted quiere pensar que para un alcance de flash la cookie debería ser eliminada aquí.

Si presento un formulario en la vista hacia Estoy redirigí, ocurre lo siguiente:

POST Response 
Set-Cookie csfcfc=_50Xfn 

El mensaje se ha ido.

Sin embargo, cuando envíe el formulario una vez más, ocurre lo siguiente:

POST Response 
Set-Cookie csfcfc=_52Xfn 

Y, el mensaje es volver :(

Si yo otra vez envíe el formulario:

POST Response 

No hay más encabezado Set-Cookie y el mensaje se ha ido una vez más. Si continúo enviando el formulario, la última cookie (csfcfc = _52Xfn) sigue siendo enviada al servidor, pero ya no hay más cookies nuevas. conjunto de mensajes y no se muestran mensajes.

Editar:

durante la depuración me encontré con una sección crítica en ELFlash.java (Mojarra 2.0.3):

void saveAllMessages(FacesContext context) { 
    // take no action on the GET that comes after a REDIRECT 
    Map<Object, Object> contextMap = context.getAttributes(); 
    PreviousNextFlashInfoManager flashManager; 
    if (null == (flashManager = getCurrentFlashManager(contextMap, true))) { 
     return; 
    } 
    if (flashManager.getPreviousRequestFlashInfo().isIsRedirect()) { 
     return; 
    } 
} 

Durante el contexto de la solicitud GET seguir la redirección, es de suponer isIsRedirect devolvería true, pero devolvió false. Este podría ser un problema local, que voy a investigar más a fondo.

interesante a observar es quizá que los valores de cookie en realidad tienen algún significado, de acuerdo a lo siguiente:

FirstTimeThru("f"), 
SecondTimeThru("s"), 
IsRedirect("r"), 
IsNormal("n"); 

Así que la primera galleta (_50Xfr), es una FirstTimeThru y una IsRedirect.

+1

El comentario en ELFlash dice: 'Cualquier entrada colocada en el" siguiente "mapa flash a petición N expirará al final de la solicitud N + 1.', pero esto nunca parece suceder. También esperaría que JSF escriba una cookie vacía en esta solicitud N + 1 para eliminarla del cliente, pero esto nunca sucede. – akira

-2

establecer remostrado propiedad en false Probar:

<p:growl redisplay="false"/> 
4

Su problema concreto es causado por un error en las versiones anteriores de Mojarra, específicamente issue 1751. Sin embargo, ha habido muchos informes de problemas para el alcance del flash después. El alcance flash está en versiones anteriores de Mojarra conocidos para los siguientes problemas principales:

Con todo, puede concluir que tendrá que actualizar a un mínimo de Mojarra 2.1.27/2.2.5 (fecha de vencimiento 2 de enero de 2014) con el fin de deshacerse de todos esos problemas.

Cuestiones relacionadas