Bonjour à tous,

Je ne sais pas si le titre est très parlant, mais je savais pas trop comment résumer le soucis en quelques mots. Que je vous détaille la chose. J'arrive à la phase de développement où je mets en place les "validators" pour être sur que les utilisateurs de mon application web ne fassent pas trop de bêtises avec les formulaires.

J'utilise l'attribut "validator" des inputs pour définir des méthodes de validation au sein des mes backing beans, mais parfois, j'ai besoin que la validation prenne en compte plusieurs champs (pour un changement de mot de passe avec vérification par exemple). Là du coup, ça bloque.

J'ai vu dans la discussion au sujet de la FAQ JSF une astuce pour faire cela : on ajoute un champ hidden a la fin du formulaire et c'est lui qui valide tout. Soucis : moi j'utilise pas de binding comme dans l'exemple proposé, je ne passe plus que par des values, le binding, je trouve ca un peu lourd avec les casts et tout et tout.

En gros, mon code, ca donne :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
<h:form>
    <t:message for="validation" />
 
    <t:panelGrid columns="2">
        <t:outputText value="New password"/>
        <t:inputSecret value="#{backingBean.newPass}" />
 
        <t:outputText value="Confirmation" />
        <t:inputSecret value="#{backingBean.confirmation}" />
    </t:panelGrid>
 
    <t:inputHidden id="validation" validator="#{backingBean.validation}" value="validation" />
    <t:commandButton value="Change" action="#{backingBean.change}" />
</h:form>
Et coté backing bean :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 
public class BackingBean
{
 
    private String newPass, confirmation;
 
    public void validation(FacesContext fc, UIComponent comp,Object o)
    {
        if(newPass != confirmation)
        {
            throw new ValidatorException(new FacesMessage("Error"));
        }
    }
 
    public String change()
    {
        // on change le mot de passe
 
        return "done";
    }
 
    // getters et setters publics pour "newPass" et "confirmation"
 
}
Le soucis étant que dans la méthode "validation", il me dit que les attributs "newPass" et "confirmation" sont null, et ce même si je rentre des valeurs dans les champs. Par contre, si j'enleve la validation, dans ma méthode "change", c'est les bonnes valeurs que je retrouve.

Je pense que cela vient du cycle JSF (du genre les "value" ne sont propagées qu'après les validations) mais n'étant pas expert de ce framework, je me tourne vers vous pour savoir si quelqu'un en saurait plus a ce sujet ?

Je pourrais faire les vérifications dans la méthode "change", mais bon, il ne s'agirait plus d'une vraie validation, et surtout je ne suis pas sur que l'ajout de messages JSF serait pris en compte.

Voila, si vous avez des idées (a part le binding si possible, car j'ai pas envie de tout refaire alors que tout marche bien a part ces validations pour le moment), je suis preneur. Merci d'avance.