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 :

Problème avec la valeur zéro dans un champ de type Integer


Sujet :

JSF Java

  1. #1
    Membre confirmé Avatar de Lordsephiroth
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2006
    Messages : 199
    Points : 494
    Points
    494
    Par défaut Problème avec la valeur zéro dans un champ de type Integer
    Bonjour à tous,

    J'ai un petit soucis avec les formulaires au travers de JSF. Mon problème est réellement idiot et je suppose qu'il y a une façon simple de résoudre ça, mais je n'ai pas réussi à trouver de solution ni sur Google ni dans la FAQ du site.

    Voici un exemple de champ de formulaire lié à un Bean qui détient les paramètres de la recherche que l'internaute demande (ici par exemple le numéro d'identification de la personne) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <h:inputText value="#{PersonSearchBean.numeroPersonne}" />
    Ce champ est de type numérique et n'est pas obligatoire (l'internaute recherche peut être par le nom ou le prénom). Mon soucis est que JSF initialise systématiquement la propriété numeroPersonne dans le bean PersonSearchBean avec la valeur zéro quand l'internaute ne remplis aucune valeur pour le champ.

    J'ai bien entendu besoin de différencier le cas où l'internaute entre réellement le chiffre zéro dans le champ du cas où l'internaute n'a rien remplis (d'autant plus que je travaille actuellement avec une base de données où la première clé primaire avec auto incrémentation est 0 et non 1... ).

    J'ai pourtant bien mis une variable de type Integer et non int, j'ai également tenté de mettre null comme valeur par défaut dans le PersonSearchBean pour le champ...

    En résumé : comment différencier avec JSF l'envoi d'un champ vide et d'un champ avec zéro lorsque le type de la propriété du bean associé est de type Integer ?


    Je parie que la solution est simplissime (impossible qu'un langage comme ça n'ait pas moyen de différencier les deux valeurs) et que je me taperai la tête en disant "mais bien sûr !!" dès que je verrai la solution.

    Merci d'avance !
    Always code as if the guy maintaining your application is a violent psychopath!
    Site personnel sur la saga Final Fantasy : http://www.final-fantasy.ch

  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 : 45
    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
    Il n'y a pas de raison, si tu as bien utiliser un Integer que JSF mette la valeur à 0 quand rien n'y est saisi...

    Peux-tu nous montrer un peu plus de code ?

    Sinon, as-tu essayé de tracer les appels au setter, par des logs, ou en mode debug, afin de savoir qui appelle cette méthode ?
    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
    Membre confirmé Avatar de Lordsephiroth
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2006
    Messages : 199
    Points : 494
    Points
    494
    Par défaut
    Le problème semble beaucoup plus complexe qu'il n'y paraît. D'après ce que j'ai pu trouver dans les spécifications finale de EL (Expression Language) située à l'adresse http://jsp.java.net/spec/jsp-2_1-fr-spec-el.pdf, la section 1.18.3 indique clairement que :

    1.18.3 Coerce A to Number type N
    ■ If A is null or "", return 0.
    ■ If A is Character, convert A to new Short((short)a.charValue()), and apply the following rules.
    ... (beaucoup d'autres règles)
    Il semble donc accepté, du point de vue des spécifications, qu'il n'y ait aucun moyen de différencier une saisie "vide" d'une saisie "0" par l'internaute dans le cas où le champ est lié par EL à un champ de type numérique (donc concerne je suppose également les Double, BigInteger, ... en plus des types int, double, float pour lesquels je suis entièrement d'accord que la conversion vers 0 s'impose).

    En cherchant un peu plus, j'ai découvert que les serveurs web n'implémentent pas tous pareillement cette section des spécifications. Il semble donc que, par exemple, Glassfish ait refusé d'implémenter ce comportement "aberrant" de conversion. Ce problème peut survenir selon le conteneur web avec lequel on travaille.

    Etant sur JBoss, je me suis intéressé à Tomcat et j'ai pu découvrir à cette adresse qu'un paramètre de configuration COERCE_TO_ZERO pouvait être utilisé pour adapter la configuration.

    Encore plus en détail :

    Tomcat n'implémentait pas correctement la spécification (donc montrait un comportement "logique" jusqu'en version 6.0.16. L'équipe de développement s'est rendue compte que la spécification n'était pas suivie et a fait un bugfix en version 6.0.17. La communauté n'ayant pas tellement aimé ce bugfix, Apache a introduit l'option COERCE_TO_ZERO quelques versions plus tard (je ne sais pas exactement laquelle).

    Pour ceux qui tomberait dans un cas similaire, voici un lien qui donne une bonne solution avec un ServletContextListener pour changer le paramètre "à chaud" lors de l'initialisation du contexte :

    http://stackoverflow.com/questions/5...ero-at-runtime

    Après 5 minutes de test, j'ai l'impression que cette solution fonctionne parfaitement sur mon JBoss 5.1.0 GA.

    Je n'ai aucun recul quand aux implications de l'activation de cette option.

    J'espère que cette réponse sera utile à quelqu'un passant par ici. Je pense d'ailleurs que ça pourrait être un point intéressant pour la FAQ JSF (erreurs courantes ou trucs et astuces), il faudra que j'y songe si j'ai un moment un de ces jours .

    Amicalement,

    Patrick
    Always code as if the guy maintaining your application is a violent psychopath!
    Site personnel sur la saga Final Fantasy : http://www.final-fantasy.ch

  4. #4
    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 : 45
    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
    Excellente analyse !

    Cela semble plausible. Je m'étonnais n'avoir jamais rencontré un tel comportement, mais étant resté à Tomcat 5.5, ceci peut expliquer cela...

    Bon à savoir en tout cas !
    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

  5. #5
    Futur Membre du Club
    Inscrit en
    Juin 2007
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 7
    Points : 8
    Points
    8
    Par défaut jsf: vide to zero
    Salut
    Merci Mr Lordsephiroth pr cette analyse. moi même J'ai trouvé ce problème lors de déploiemet ds tomcat -6-0-32 même si ça marche en localhost (tomcat -6-0-14)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 28/07/2010, 17h26
  2. [MySQL] [MySQL] Avoir une valeur NULL plutôt que 0 (zéro) dans un champ
    Par Sparktacus dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 28/07/2010, 17h24
  3. Placer le signe : dans un champ de type Integer
    Par arthuro45 dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 29/01/2010, 13h24
  4. [EJBQL] Requête avec une valeur constante dans les champs résultat
    Par adamo901 dans le forum Java EE
    Réponses: 1
    Dernier message: 13/04/2009, 00h32
  5. Réponses: 2
    Dernier message: 22/05/2007, 16h15

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