IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JSF Java Discussion :

ValidateLongRange et Expression language


Sujet :

JSF Java

  1. #1
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 807
    Points
    48 807
    Par défaut ValidateLongRange et Expression language
    bonjour, j'ai un soucis avec validateLongRange.

    J'ai ce code:
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <h:inputText value="#{job.jobDatas[parameter.key]}" rendered="#{parameter.type.name eq 'INTEGER'}">
      <f:validateLongRange minimum="#{parameter.min}" maximum="#{parameter.max}"/>
    </h:inputText>
    <h:outputText value="min is #{parameter.min} and max is #{parameter.max}" rendered="#{parameter.type.name eq 'INTEGER'}"/>
    min et max sont des getters sur des propriétés de type int. Il n'y a pas de setter associé. min, max et type sont initialisés dans le constructeur de parameter, les champs sont finaux donc non modifiables par le code. Seule particularité, "parameter" proviens de l'itération d'une datatable.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <h:dataTable value="#{job.template.parameters}" var="parameter" id="datas">
    Voilà pour le contexte. Si j'entre un nombre (exemple 3) dans le champ. J'ai le message d'erreur "Validation Error: Specified attribute is not between the expected values of 0 and 0." alors que l'outputtext à coté affiche
    "min is 0 and max is 5"

    Si je modifie le code comme ceci:
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <h:inputText value="#{job.jobDatas[parameter.key]}" rendered="#{parameter.type.name eq 'INTEGER'}">
      <f:validateLongRange minimum="#{parameter.min}" maximum="#{(parameter.max+1)+1}"/>
    </h:inputText>
    <h:outputText value="min is #{parameter.min} and max is #{parameter.max} (#{(parameter.max+1)+1})" rendered="#{parameter.type.name eq 'INTEGER'}"/>

    j'obtiens "Validation Error: Specified attribute is not between the expected values of 0 and 2." et "min is 0 and max is 5 (7)"
    Est-il possible que validatelongrange (je n'ai pas trouvé son code source) fasse l'évaluation de l'EL en dehors de la boucle (exemple à la création du tag) et donc que les EL dans validatelongrange ne peuvent pas pointer, paradoxalement, sur des Expressions qui changent de valeur? Sinon, comment expliquer ce phénomène?

  2. #2
    Rédacteur
    Avatar de romaintaz
    Homme Profil pro
    Java craftsman
    Inscrit en
    Juillet 2005
    Messages
    3 790
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Java craftsman
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2005
    Messages : 3 790
    Points : 7 275
    Points
    7 275
    Par défaut
    Très bizarre en effet.
    Que se passe t'il si tu inverses les min et max ? A savoir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <f:validateLongRange minimum="#{parameter.max}" maximum="#{parameter.min}"/>
    ou si ton parameter.min retourne une autre valeur que 0, histoire de voir si effectivement il n'arrive pas à setter correctement les bornes de façon dynamique, et donc qu'il prend par défaut la valeur 0.

    Ton bean parameter est de quel scope ? Tu as essayé en mettant en session ?
    Nous sommes tous semblables, alors acceptons nos différences !
    --------------------------------------------------------------
    Liens : Blog | Page DVP | Twitter
    Articles : Hudson | Sonar | Outils de builds Java Maven 3 | Play! 1 | TeamCity| CitConf 2009
    Critiques : Apache Maven

  3. #3
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 807
    Points
    48 807
    Par défaut
    Citation Envoyé par romaintaz Voir le message

    Ton bean parameter est de quel scope ? Tu as essayé en mettant en session ?
    Scope, mais ça ne change rien, car son contenu est initialisé à partir de données fixes qui sont extraites d'une annotation d'un classe. Donc impossible qu'elle soient à une valeur différente entre le moment où on valide et les moment où on fait l'outputText! Si type est correct (or il l'est sinon rendered=false et pas de validation du composant car pas visible), min et max le sont aussi, d'office.


    Maintenant, je viens de jeter un oeil au validator Tag JSP de myfaces 1.2. J'utilise facelets et majora mais le principe doit, je pense, rester le même:
    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    public class ValidateLongRangeTag
        extends GenericMinMaxValidatorTag<Long>
    {
      //.......
    }
    public abstract class GenericMinMaxValidatorTag<T>
        extends ValidatorTag
    {
        protected  ValueExpression _minimum;
        protected  ValueExpression _maximum;
        protected T _min = null;
        protected T _max = null;
    //..... snip
        protected Validator createValidator() throws JspException
        {
            if (null == _minimum && null == _maximum){
                throw new JspException("a minimum and / or a maximum have to be specified");
            }
            ELContext elContext = FacesContext.getCurrentInstance().getELContext();
            if (null != _minimum){
                _min = getValue(_minimum.getValue(elContext));
            }
            if (null != _maximum){
                _max = getValue(_maximum.getValue(elContext));
            }
            if (null != _minimum && null != _maximum){
                if (!isMinLTMax()){
                    throw new JspException("maximum limit must be greater than the minimum limit");
                }
            }
            return super.createValidator();
        }
    //....
    Comme je le craignais, les bornes sont évaluées au moment de la création du validator. Hors, dans une datatable, les composants sont créés en dehors de toute itération et une seule fois. Donc parameter n'existe pas à ce moment là et les bornes sont nulles. Je vais donc être bon pour un validateur custom :/

Discussions similaires

  1. Non-accés au EL(Expressions Languages)
    Par atar64 dans le forum Servlets/JSP
    Réponses: 7
    Dernier message: 08/06/2007, 16h56
  2. Jonas Et Expressions Languages
    Par Merriadoc dans le forum JOnAS
    Réponses: 1
    Dernier message: 08/06/2007, 07h32
  3. [JSP 2.0] Afficher un tableau via les expression language
    Par brainstorm dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 23/06/2006, 16h07
  4. Expression language non active
    Par brainstorm dans le forum Servlets/JSP
    Réponses: 5
    Dernier message: 15/06/2006, 15h22
  5. [JSP] Expressions Languages et constantes
    Par Beuss dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 14/06/2006, 11h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo