2011-09-21 32 views
6

Tengo una página JSF (que usa MyFaces 2.0) que hace un poco de recopilación de datos la primera vez que se muestra. Si no puede encontrar cierta información, se supone que debe proporcionar un mensaje a ese efecto y redireccionar a una página diferente. He intentado utilizar la solución que se encuentra aquí Preserving FacesMessage after redirect for presentation through <h:message> in JSF (setKeepMessages (true)) pero los mensajes no se muestran después de la redirección. La única diferencia que puedo elegir es que no estoy usando una regla de navegación, estoy llamando a la llamada de redirección() en el contexto externo porque esto no ocurre en una acción normal.Preservar mensajes JSF después de una redirección

código relevante:

public void redirectToPageWithMessage(String inPage, String message, FacesMessage.Severity severity){ 
    getFlash().setKeepMessages(true); 
    addMessage(message, severity); 
    try { 
     getFacesContext().getExternalContext().redirect(inPage); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

Desafortunadamente, esto no parece estar funcionando. La redirección ocurre muy bien, pero la etiqueta < messages /> no muestra el mensaje. ¿Hay algo diferente sobre la forma en que redirige() que impide que esto funcione?

Respuesta

4

El código que guarda los mensajes se ejecuta después de que finaliza la fase (ver Flash.doPostPhaseActions (FacesContext)). Por lo tanto, se espera que no funcione, pero tal vez pueda llamar a Flash.doPostPhaseActions antes de la redirección. La nota no es una solución "limpia", pero es posible.

+0

¿Hay una manera mejor (que no sea llamar a redirect()) para redirigir dentro de una función que no devolverá un resultado? – moneyt

0

JSFMensajes se guardan solo para el procesamiento de la solicitud real. Se realiza una segunda solicitud cuando se utiliza la redirección, por lo que se perderán los mensajes JSF. EL-Flash es una forma de evitar esto. Este ejemplo debería funcionar: http://ocpsoft.com/java/persist-and-pass-facesmessages-over-page-redirects/

+3

¿Te perdiste el primer párrafo sobre 'setKeepMessages (true)' y la línea 'getFlash(). SetKeepMessages (true);' el fragmento de código de la pregunta? Él ** ya ** está usando Flash, pero no funciona correctamente en combinación con 'ExternalContext # redirect()'. – BalusC

0

Tuve el mismo problema y lo resolví utilizando ExternalContext.redirect() pero para jugar con el resultado de tus acciones.

Es decir, mi acción llamada por mis botones devuelve un String (el resultado) que indica las reglas de navegación para ir a la página siguiente. Con ese sistema, los mensajes se conservan.

+1

Así que ahora está reenviando en lugar de redirigir. Para eso, ya no necesitas el 'Flash # setKeepMessages()'. ¿O realmente no lo estabas usando en absoluto? – BalusC

+0

Tiene razón, dejé de usarlo :) En realidad, lo encontré cuando encontré el error [WELD-1218] (https://issues.jboss.org/browse/WELD-1218). –

Cuestiones relacionadas