2010-05-27 4 views
11

Dans mon écran, j'ai une liste déroulante (boîte de sélection), sur la sélection de l'une des options dans cette liste déroulante, j'affiche une ou plusieurs zones de texte à côté de la boîte de sélection en utilisant javascript/css-display: bloc. Tous ces contrôles d'entrée sont dans la même forme jsf. Chacun des contrôles d'entrée possède son propre validateur. Le problème est supposé que l'utilisateur sélectionne option1 de la boîte de sélection et n'a pas valeur d'entrée ou les entrées d'une valeur incorrecte pour inputbox1, ajouter une FacesMessage personnalisée dans le validateur et est représentée de manière appropriée et supposons que l'utilisateur sélectionne le option2 la deuxième fois et entre la mauvaise valeur pour le inputbox2 puis un autre FacesMessage est ajouté dans le validateur. Mais Maintenant les deux messages sont montrés - signifie - le message pour inputbox1 et inputbox2 - ce qui est faux Mon hypothèse est que cela se produit parce qu'ils existent sous la même forme et leurs instances ne sont pas encore détruites dans le FacesContext et dans le UIView . J'ai décidé de supprimer les messages de cette façonComment supprimer FacesMessages du FacesContext?

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

Mais cela donne parfois java.util.NoSuchElementException org.apache.myfaces.shared_impl.renderkit.html.HtmlMessagesRendererBase $ MessagesIterator.next

donc 2 questions:

1) Quel est le problème de la suppression des FacesMessages de cette façon? J'utilise myfaces-api-1.2.3.jar et myfaces-impl-1.2.3.jar

2) Y a-t-il une meilleure approche pour gérer mon scénario? Je ne veux afficher les messages relevent chaque fois qu'une demande est traitée jsf

Merci

Répondre

3

Le problème n'était pas que je ne pouvais pas supprimer les messages du FacesContext. Le problème était que chaque fois que le formulaire était soumis, il y avait peu de contrôles d'entrée (qui ne s'affichaient pas avec display: none) qui conservaient certaines valeurs() et le code Validators and Backing Bean ajoutait les FacesMessages pour les contrôles d'entrée non visibles dans le FacesContext. Maintenant, chaque fois que l'option de sélection a été modifiée, j'ai effacé les autres champs de formulaire qui n'étaient pas nécessaires et donc les messages ne sont pas ajoutés.

0

Je ne me MyFaces, je ne peux pas aller en détail à ce sujet, mais au soleil RI (Mojarra) la bug de facesemessages inamovibles a été corrigé dans la version 1.2_07 il y a environ 1.5 ans.

Donc, pour obtenir ce que vous voulez, essayez de mettre à jour MyFaces avec le dernier disponible (ils peuvent avoir corrigé le même bug) ou le remplacer par Mojarra.

+0

Merci pour votre réponse.Le problème n'était pas que je ne pouvais pas supprimer les messages du FacesContext.Le problème était que chaque fois que le formulaire a été soumis il y avait peu de contrôles d'entrée (qui n'étaient pas affichés en utilisant display: none) qui a conservé certaines valeurs() et ainsi le code Validators et Backing Bean a ajouté les FacesMessages pour ces contrôles d'entrée non visibles dans le FacesContext. Maintenant, chaque fois que l'option de sélection a été modifiée, j'ai effacé les autres champs de formulaire qui n'étaient pas nécessaires et donc les messages ne sont pas ajoutés. Ai-je raison? – gekrish

4

Pour autant que je peux dire cela ne suffit pas, puisque dans

org.apache.myfaces.context.servlet.FacesContextImpl 

(Version: 2.0.15, révision: 1364593), il y a 2 listes de messages (_orderedMessages et _messages) et votre méthode efface seulement _orderedMessages.

Pour effacer _messages faire:

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

S'il vous plaît noter que ceci est très fragile car elle repose sur les détails de mise en œuvre, mais je ne pouvais pas trouver une meilleure façon :(

+0

Il lance également une exception 'UnsupportedOperationException' même si la liste n'est pas vide, dans 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(); 
    }