2010-05-27 13 views
11

Nel mio schermo, ho un menu a discesa (casella di selezione), sulla selezione di una qualsiasi delle opzioni in questo menu a discesa, visualizzo una o più caselle di testo accanto alla casella di selezione utilizzando javascript/css - display: none e display: bloccare. Tutti questi controlli di input sono nella stessa forma jsf. Ciascuno dei controlli di input ha il proprio validatore. Il problema si supponga che l'utente seleziona opzione1 dalla casella di selezione e non fa valore di ingresso o inserisce un valore errato per inputbox1, aggiungo un FacesMessage personalizzato nel Validator e viene mostrato in modo appropriato e supponiamo l'utente seleziona il opzione2 la seconda volta e immette il valore errato per la casella di input quindi un altro FacesMessage viene aggiunto nel validatore. Ma Ora vengono visualizzati entrambi i messaggi - significa - il messaggio per inputbox1 e inputbox2 - che è sbagliato La mia ipotesi è che ciò avvenga perché esistono nella stessa forma e le loro istanze non sono ancora distrutte in FacesContext e nella UIView . Ho deciso di cancellare i messaggi in questo modoCome rimuovere FacesMessages da FacesContext?

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

Ma questo a volte dà java.util.NoSuchElementException org.apache.myfaces.shared_impl.renderkit.html.HtmlMessagesRendererBase $ MessagesIterator.next

Quindi 2 domande:

1) Qual è il problema nell'eliminazione di FacesMessages in questo modo? Sto usando myfaces-api-1.2.3.jar e myfaces-impl-1.2.3.jar

2) Esiste un approccio migliore per gestire il mio scenario? Voglio solo mostrare i messaggi pertinenti ripresi ogni volta che una richiesta JSF viene elaborato

Grazie

risposta

3

Il problema non è che non sia stato possibile eliminare i messaggi da FacesContext. Il problema era che ogni volta che veniva inviato il modulo c'erano pochi controlli di input (che non venivano visualizzati usando display: none) che manteneva alcuni valori() e quindi il codice Validators e Backing Bean aggiungeva FacesMessages per quei controlli di input non visibili nel FacesContext. Ora, ogni volta che l'opzione select è stata cambiata, ho cancellato gli altri campi del modulo che non erano necessari e quindi i messaggi non sono stati aggiunti.

0

Io non uso MyFaces, quindi non posso andare in dettaglio su questo, ma al sole RI (Mojarra) il bug di volti irrisolvibili è stato risolto nella versione 1.2_07 circa 1.5 anni fa.

Quindi, per ottenere ciò che si desidera, provare ad aggiornare MyFaces all'ultimo disponibile (potrebbero aver risolto anche lo stesso errore) o sostituirlo con Mojarra.

+0

Grazie per la risposta.Il problema non era che non ero in grado di eliminare i messaggi da FacesContext.Il problema era che ogni volta che il modulo è stato inviato c'erano pochi controlli di input (che non venivano visualizzati usando display: none) che ha mantenuto alcuni valori() e quindi il codice Validators e Backing Bean ha aggiunto FacesMessages per quei controlli di input non visibili in FacesContext. Ora, ogni volta che l'opzione select è stata cambiata, ho cancellato gli altri campi del modulo che non erano necessari e quindi i messaggi non sono stati aggiunti. Ho ragione? – gekrish

4

Per quanto posso dire questo non è sufficiente, dal momento che in

org.apache.myfaces.context.servlet.FacesContextImpl 

(Versione: 2.0.15, revisione: 1.364.593), ci sono 2 liste di messaggi (_orderedMessages e _messages) e il metodo di cancella solo _orderedMessages.

Per cancellare _messages fare questo:

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(); 
    } 
} 

Si prega di notare, inoltre, che questo è molto fragile, dato che si basa sui dettagli di implementazione, ma non ho potuto trovare un modo migliore :(

+0

Genera anche un 'UnsupportedOperationException' anche se l'elenco non è vuoto, in 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(); 
    }