12
votes

JSF 2 - Validation des haricots: échec de la validation -> Les valeurs vides sont remplacées par la dernière valeurs valides du haricot géré.


Je ne comprends pas le comportement de JSF2 pendant la valdation. J'espère que quelqu'un peut m'aider.

J'ai une forme où les champs sont validés après (Ajax) Soumettre - OK

Si la validation a échoué, un message d'erreur est affiché - OK

Pour mon exemple lorsque je saisis un anniversaire valide et le champ nom est vide pour nom est affiché après la soumission.
Maintenant, lorsque je saisis un nom valide et supprimez l'entrée du champ anniversaire un erroressage est montrant pour anniversaire (c'est bon) mais maintenant l'ancien 'Valide' anniversaire est également dans le champ de saisie !?!

Comment puis-je éviter ce comportement? Lorsque je soumets un champ vide, je veux voir un errorormessage et un champ vide ...

Voici mon code d'échantillon:

J'utilise un gestionnaire ( testbean ) qui contient un entitébean ( contact ). Le contact contient des validations par annoation. xxx

mon managementbean : xxx

A ici ma page JSF: xxx

enfin d'un extrait de web.xml xxx

merci pour quelques conseils


0 commentaires

4 Réponses :


0
votes

Je pense que pendant la normale, les gens n'entreront pas une date valide, soumettez, puis supprimez la date avant de soumettre à nouveau. Je me rends compte que vous avez trouvé cela au cours des tests, mais les gens essaient probablement de remplir avec succès le formulaire et de ne pas supprimer les choses qu'elles sont déjà entrées, auquel cas tenir peut-être la dernière valeur valide est la meilleure fonctionnalité.

Si vous insistez ... il semble que la méthode de setter "Anniversaire" n'est jamais appelée parce que la valeur n'est pas valide, puis lorsque la page est refaire la valeur actuelle de "Anniversaire" (la valeur actuelle étant la validité valeur qui a été précédemment enregistrée). Peut-être que vous pourriez écrire un validateur personnalisé qui définit la valeur, puis valide la valeur, mais cela n'aurait pas beaucoup de sens. Vous devrez toujours valider la valeur en premier pour les cas lorsque les utilisateurs entrent dans une chaîne de texte comme «hier» au lieu d'une date valide, puis vous devez définir la date à quelque chose en fonction de cette valeur non valide, puis vous auriez. pour ajouter le message au facescontext. Donc, le code devrait faire quelque chose comme ce qui suit.

1) Valider la valeur de la date
2) Si ce n'est pas valide, définissez le champ sur une valeur qui a du sens et ajoutez un message d'erreur à facescontext.
3) Si c'est valide, utilisez-le.

C'est difficile, mais étrange, car vous modifiez la valeur du champ, même si la valeur transmise est invalide ...


1 commentaires

Salut Aaron, merci pour votre réponse! I Mon exemple de code Il existe un autre cas qui montrent le même problème tout en essayant de remplacer le modèle de backend (bouton NewContact). Pour moi, cela ressemble à un problème de monde réel - et pas comme un cas de test académique. J'ai trouvé une solution (pas bien, mais ça marche ...). Pour les solutions, j'ai modifié un peu de code un peu. Voir ma propre réponse



0
votes

Aaron décrit déjà le comportement.

Le problème que j'ai décrit existe également en cliquant sur le bouton "NewContact". Si la première soumission n'est pas valide (anniversaire a été entrée, le champ Nom est vide) Un message d'erreur est affiché. OK.

Ensuite, le bouton "NewContact" Ne pas rafraîchir (clair) la vue. Bien que le modèle ait été réintégré (contact = nouveau contact ()).

J'ai trouvé des tipps ici: http://wiki.apache.org/myfaces/clearinpomponents

Voici ma solution: xxx


0 commentaires

10
votes

Votre problème particulier est causé par

if (component instanceof UIInput && !((UIInput) component).isValid()) {
    Object submittedValue = ((UIInput) component).getSubmittedValue();
    if (submittedValue != null) {
        // value may not be a String...
        return submittedValue.toString();
    } else {
        return null;
    }
}


4 commentaires

J'ai remarqué un comportement similaire lorsqu'une entrée est liée à une propriété non chaîne avec un convertisseur, éventuellement due à la même cause première. Lorsque vous placez dans une chaîne vide et que la validation échoue à cause d'un champ différent, votre chaîne vide (valide) est écrasée avec la valeur du haricot. A été rapporté comme Java.net/jira/browse/javaserverfaces-838


@Ballusc: Merci pour votre explication détaillée! Vos solutions / explications ici font souvent ma journée ;-)


@Balusque cela signifie-t-il qu'il compilait une version personnalisée de JSF? J'ai rencontré ce même problème et j'espère que ce n'est pas la seule solution.


@Mike: Pour les démarreurs, le moyen le plus simple est de Copypaste brut .java fichier source de htmlbasicrenderer directement dans votre projet WebApp (tout en conservant le package d'origine!), Puis le modifier. Il obtiendra la priorité en classement sur le pot dans / web-inf / lib .



0
votes

a eu un problème similaire dans lequel une valeur chargée de la graine de support serait réinitialisée lorsque le champ a été masqué et une autre composante échoue. Je devais faire un léger ajout au code de Balusc pour le faire fonctionner. xxx


0 commentaires