2010-05-27 36 views
11

En mi pantalla, tengo un desplegable (seleccionar recuadro), al seleccionar cualquiera de las opciones en ese menú desplegable, visualizo uno o más cuadros de texto al lado del recuadro de selección usando javascript/css - display: none y visualización: bloquear. Todos estos controles de entrada están en la misma forma jsf. Cada uno de los controles de entrada tiene su propio validador. El problema se supone que el usuario selecciona la opción 1 de la caja de selección y no valora la entrada o entradas de un valor incorrecto para inputbox1, agrego un FacesMessage personalizado en el validador y se muestra de manera adecuada y supongamos que el usuario selecciona el opcion2 la segunda vez e ingresa el valor incorrecto para inputbox2 y luego se agrega otro FacesMessage en el validador. Pero Ahora ambos mensajes se muestran - significa - el mensaje para inputbox1 y inputbox2 - que es incorrecto Mi suposición es que esto sucede porque existen en la misma forma y sus instancias no se destruyen aún en FacesContext y en UIView . Decidí eliminar los mensajes de esta maneraCómo eliminar FacesMessages de FacesContext?

Iterator<FacesMessage> msgIterator = FacesContext.getCurrentInstance().getMessages(); 
    while(msgIterator.hasNext()) 
    { 
     msgIterator.next(); 
     msgIterator.remove(); 
    } 

Pero esto a veces da java.util.NoSuchElementException org.apache.myfaces.shared_impl.renderkit.html.HtmlMessagesRendererBase $ MessagesIterator.next

Así que 2 preguntas:

1) ¿Cuál es el problema al eliminar los FacesMessages de esta manera? Estoy usando myfaces-api-1.2.3.jar y myfaces-impl-1.2.3.jar

2) ¿Hay un mejor enfoque para manejar mi escenario? Yo sólo quiero mostrar mensajes relevent cada vez que una petición JSF se procesa

Gracias

Respuesta

3

El problema no era que no pudiera eliminar los mensajes de FacesContext. El problema era que cada vez que se enviaba el formulario había pocos controles de entrada (que no se mostraban con display: ninguno) que conservaban algunos valores() y el código Validators y Backing Bean agregaba FacesMessages para esos controles de entrada no visibles en el FacesContext. Ahora, cada vez que se cambiaba la opción de selección, borraba los otros campos de formulario que no eran necesarios y, por lo tanto, no se agregaban los mensajes.

0

No consumo MyFaces, así que no puedo entrar en detalle acerca de esto, pero en el sol de RI (Mojarra) del El error de los mensajes de caras irreversibles se ha corregido en la versión 1.2_07 hace aproximadamente 1.5 años.

Para lograr lo que quiere, intente actualizar MyFaces a la última disponible (también podrían haber solucionado el mismo error) o reemplazando por Mojarra.

+0

Gracias por su respuesta. El problema no fue que no pude eliminar los mensajes de FacesContext. El problema era que cada vez que se enviaba el formulario había pocos controles de entrada (que no se mostraban usando display: none) que conservó algunos valores() y así el código Validators y Backing Bean agregó los FacesMessages para esos controles de entrada no visibles en FacesContext. Ahora, cada vez que se cambiaba la opción de selección, borraba los otros campos de formulario que no eran necesarios y, por lo tanto, no se agregaban los mensajes. ¿Estoy en lo cierto? – gekrish

4

Por lo que yo puedo decir esto no es suficiente, ya que en

org.apache.myfaces.context.servlet.FacesContextImpl 

(versión: 2.0.15, revisión: 1.364.593), hay 2 listas de mensajes (_orderedMessages y _messages) y su método solo borra _orderedMessages.

Para borrar _messages hacer esto:

Iterator<String> itIds = FacesContext.getCurrentInstance().getClientIdsWithMessages(); 
while (itIds.hasNext()) { 
    List<FacesMessage> messageList = FacesContext.getCurrentInstance().getMessageList(itIds.next()); 
    if (!messageList.isEmpty()) { // if empty, it will be unmodifiable and throw UnsupportedOperationException... 
     messageList.clear(); 
    } 
} 

Tenga en cuenta también que esto es muy frágil ya que depende de los detalles de implementación, pero no pude encontrar una mejor manera :(

+0

También arroja una 'UnsupportedOperationException' aunque la lista no está vacía, en JSF2.0 (Mojarra). – Jaumzera

0
FacesContext context = FacesContext.getCurrentInstance(); 
Iterator<FacesMessage> it = context.getMessages(); 
while (it.hasNext()) { 
    it.next(); 
    it.remove(); 
} 
0
if (FacesContext.getCurrentInstance().getMessages() != null) { 
     FacesContext.getCurrentInstance().getMessages().remove(); 
    }