2010-05-27 20 views
11

In meinem Bildschirm habe ich ein Dropdown (Auswahlfeld), zur Auswahl einer der Optionen in diesem Dropdown-i angezeigt werden ein oder mehrere Textfelder neben dem Auswahlfeld Javascript/CSS mit - display: none und Anzeige: Block. Alle diese Eingabesteuerelemente haben dieselbe jsf-Form. Jede der Eingabesteuerungen hat ihren eigenen Validator. Das Problem wird Angenommen, der Benutzer option1 vom Auswahlfeld auswählt und nicht Werteingabe oder gibt einen falschen Wert für inputbox1, i eine benutzerdefinierte Facesmessage in dem Validator hinzuzufügen und wird in geeigneter Weise und Angenommen, der Benutzer wählt die option2 gezeigt das zweite Mal und gibt den falschen Wert für die inputbox2 dann ein anderes in der Validierer Facesmessage hinzugefügt wird. Aber Nun sind beide die Nachrichten angezeigt - Mittel - die Nachricht für inputbox1 und inputbox2 - die falsch Meine Vermutung ist, dass dies geschieht, weil sie in der gleichen Form vorliegen und die Instanzen sind noch nicht in der Faces und in der UIView zerstört . Ich beschloss, die Nachrichten auf diese WeiseWie entferne ich FacesMessages vom FacesContext?

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

Aber manchmal gibt java.util.NoSuchElementException org.apache.myfaces.shared_impl.renderkit.html.HtmlMessagesRendererBase $

So 2 Fragen MessagesIterator.next zu löschen:

1) Was ist das Problem, die FacesMessages diese Art und Weise in zu löschen? Ich verwende myfaces-api-1.2.3.jar und myfaces-impl-1.2.3.jar

2) Gibt es einen besseren Ansatz mein Szenario zu behandeln? Ich möchte nur relevent Nachrichten wird jedes Mal eine JSF Anfrage

Dank verarbeitet zeigen

Antwort

3

Das Problem war nicht, dass ich nicht in der Lage war, die Nachrichten aus dem Faces zu löschen. Das Problem war, dass jedes Mal, wenn das Formular übergeben wurde, nur wenige Eingabesteuerelemente (die nicht mit display: none angezeigt wurden), die einige Werte() beibehielten, hinzugefügt wurden. Daher fügten der Validator- und der Backing-Bean-Code die FacesMessages für die nicht sichtbaren Eingabesteuerelemente hinzu FacesContext. Jetzt, jedes Mal, wenn die Auswahloption geändert wurde, löschte ich die anderen Formularfelder, die nicht notwendig waren, und so wurden die Nachrichten nicht hinzugefügt.

0

ich nicht MyFaces verwenden, so kann ich nicht im Detail darüber gehen, aber in der Sonne RI (Mojarra) die Fehler von nicht entfernbaren Gesichternachrichten wurde in der Version 1.2_07 vor etwa 1.5 Jahren behoben.

Um das zu erreichen, was Sie wollen, versuchen Sie, MyFaces auf den neuesten Stand zu bringen (möglicherweise haben sie den gleichen Fehler behoben) oder ersetzen durch Mojarra.

+0

Vielen Dank für Ihre Antwort Das Problem war nicht, dass ich die Nachrichten aus dem FacesContext nicht löschen konnte Das Problem war, dass jedes Mal, wenn das Formular gesendet wurde, nur wenige Eingabesteuerelemente vorhanden waren (die nicht mit angezeigt wurden) display: none), die einige Werte beibehalten hat() und so der Validator- und der Backing-Bean-Code die FacesMessages für diese nicht sichtbaren Eingabesteuerelemente im FacesContext hinzugefügt haben. Jetzt, jedes Mal, wenn die Auswahloption geändert wurde, löschte ich die anderen Formularfelder, die nicht notwendig waren, und so wurden die Nachrichten nicht hinzugefügt. Habe ich recht? – gekrish

4

Soweit ich das sagen kann, ist nicht genug, denn in

org.apache.myfaces.context.servlet.FacesContextImpl 

(Version: 2.0.15, Revision: 1.364.593), gibt es 2 Listen von Nachrichten (_orderedMessages und _messages) und Ihrer Methode löscht nur _orderedMessages.

_messages löschen dies tun:

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

Bitte beachten Sie auch, dass diese sehr zerbrechlich ist, da es auf Details der Implementierung beruht, aber ich konnte keinen besseren Weg :(

+0

Es wird auch eine 'UnsupportedOperationException' ausgelöst, obwohl die Liste in JSF2.0 (Mojarra) nicht leer ist. – 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(); 
    } 
finden