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 :

Converter sur plusieurs champs


Sujet :

JSF Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 : 40
    Localisation : Suisse

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 199
    Par défaut Converter sur plusieurs champs
    Bonjour à tous,

    Je vous soumets ici un petit problème que je rencontre actuellement.

    Mon problème vient principalement du fait que je monte une application sur une base de données existante. Imaginez donc que j'ai une table contenant des personnes, mais que cette table, au lieu d'avoir un identifiant unique numérique auto incrémenté, possède une clé primaire sur plusieurs champs. Comme exemple, disons le nom, le prénom et l'âge (String, String, Integer).

    Au niveau de JPA, tout se passe à merveille avec un objet PersonEntity qui a une clé primaire @Id placé sur un objet PersonEntityPk contenant les trois champs. Ma seconde classe, disons Vehicule, est associé à une et une seule personne. Nous avons donc une bête @ManyToOne placée avec un lot @JoinColumns contenant trois @JoinColumn contenant le nom, prénom et âge.

    Au niveau de la couche web, j'ai un managed bean VehiculeBean contenant l'objet Véhicule (en fait un DTO récupéré de la couche applicative, mais ça change peu de choses). Cet objet véhicule possède naturellement un champ Personne représentant la relation @ManyToOne.

    Là où j'ai un peu plus de mal, c'est sur le formulaire permettant d'ajouter des véhicules. Le formulaire va contenir entre autre les trois champs formant la clé primaire de la personne à associer. Il ont cette tête (le champ value n'est pas mentionné car je ne sais pas encore comment le placer) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <h:inputText id="nom" value="#{...}" />
    <h:inputText id="prenom" value="#{...}" />
    <h:inputText id="age" value="#{...}" />
    J'aimerais placer ensuite un Converter permettant de transformer lors de la sousmission de ce formulaire les trois champs en un objet Personne.

    Mon principal problème est que dans mon Converter, je n'ai accès qu'à l'une des trois valeurs à la fois. C'est d'ailleurs normal, la conversion est réalisée avant la mise à jour des composants de la vue JSF. Quand je suis dans la méthode getAsObject de mon Converter, j'ai l'une des trois valeurs initialisée, celle qui est passée à la fonction. J'ai testé et je ne peux malheureusement pas récupérer la valeur du formulaire avec un code ressemblant à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UIInput nomComponent = (UIInput)context.getViewRoot().findComponent("contentForm:nom");
    La raison est, si j'ai bien saisi le cycle de vie des composants JSF, que la phase "Apply Request Values" effectue la conversion avant de mettre à jour l'arbre de la vue.

    J'ai malheureusement besoin des trois valeurs pour trouver mon objet personne.

    Notez également que les trois champs n'ont pas de required="true". En effet, la relation est optionnelle. Je ne peux donc pas m'assurer que je vais à tout coup passer dans le Converter pour le troisième champ (auquel cas j'aurais peut être pu rajouter un managed bean pour mettre en session les valeurs des deux premiers champs lors des deux premiers appels au converter, puis lorsque le troisième appel est réalisé récupérer de la session les valeurs des deux premiers champs pour faire l'appel applicatif et trouver la bonne personne dans la base de données).

    Je ne vois pas comment m'y prendre pour ce cas, je suppose qu'il doit pourtant y avoir un moyen relativement simple de gérer ça.

    Désolé si la lecture est un peu longue, mon problème est pas long à expliquer, par contre ce que j'ai déjà testé l'est un peu plus.

    Si je résume : comment arriver à associer un Converter à plusieurs champs pour les convertir en un objet de BD possédant une clé primaire multiple.

    Merci d'avance pour vos suggestions !

  2. #2
    Expert éminent
    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 : 45
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Vous n'avez aucune conversion à faire. Ces trois champs doivent mapper vers 3 propriétés de type string. JSF n'a pas besoin de converter pour assigner des String. Ensuite, à vous, dans votre Action JSF à déduire de ces trois string et du reste comment construire/adapter votre objet Voiture pour le soumettre à JPA. Si une soucis dois se présenter à ce moment, il est toujours possible de déclencher une Exception.

    Voilà pour la résolution simple.

    Maintenant, concrètement, il est possible de connaitre les valeurs des autres champs, c'est ainsi qu'on peux faire un Validateur du type "les deux champs mot de passe doivent être identique". Vous devez passer par findCompoent et lui passer l'id du composant qu'il a besoin de regarder, et aller récupérer la sublmittedValue de ce composant.

  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 : 40
    Localisation : Suisse

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 199
    Par défaut
    Bonjour et merci de la réponse.

    J'arrive bien entendu à mapper les trois champs sur des champs String d'un bean. Ceci n'est pas un problème. Je pourrais également me contenter de cette solution, et convertir les trois valeurs au début de la fonction applicative de mon managed bean (et initialiser des messages d'erreurs par l'accès au FacesContext si la conversion échoue).

    Ce que je cherche à faire, c'est d'utiliser un Converter pour un objet à clé primaire sur des champs multiples. Pourquoi un Converter particulièrement ? Simplement pour réutiliser le code. Il se trouve qu'il y a passablement d'objets que je dois lier aux personnes. Avoir un Converter pour y mettre ce code permet de tout réutiliser en bloc, plutôt que d'avoir dans chacun de mes beans quelques lignes qui vont convertir l'objet avant l'appel applicatif.

    Une raison supplémentaire vient s'ajouter à ça : si je fais une conversion de l'objet avant l'appel applicatif, je me retrouve dans un système de conversion / validation à trois niveau :
    1) conversions et validations sur les autres champs du formulaire
    2) conversions des trois champs vers mon objet personne (juste avant l'appel applicatif)
    3) validations business (qui ne peut être faite que si la conversion de l'objet personne a réussi)

    Donc dans le cas présent, un utilisateurs pourrait se trouver bloquer dans l'envoi du formulaire trois fois de suite, ceci même si il corrige les erreurs qui lui sont affichées à chaque étape, ce qui est un peu perturbant (2 c'est déjà bien assez).

    Concernant la remarque sur findComponent, cette méthode ne marche malheureusement pas puisque la conversion se passe en amont de la mise à jour de l'arbre des composants dans le cycle JSF. Lorsque mon Converter s'exécute, l'arbre ne contient pas encore les valeurs que l'internaute a entré.

    Visiblement je n'étais pas assez clair dans mon premier post, je dois avouer que j'ai réellement du mal à formuler ce que je cherche à faire (ou ce que j'ai déjà tenté) de manière précise.

  4. #4
    Expert éminent
    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 : 45
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Si l'arbre contient les valeur dans "submittedValue", puisque c'est là qu'elle sont stockées après la phase "decode".

    Pour créer un converter, un converter est unique par composant. Si vous voulez donnez dans la réutilisabilité de votre clé, mieux vaut créer un composant custom.

    PS: pourquoi utiliser des textfields? Si c'est une clé étrangère, elle est à choisir dans une liste de clés existantes -> Mieux vaut s'orienter vers un uiselectone.

  5. #5
    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 : 40
    Localisation : Suisse

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 199
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    Si l'arbre contient les valeur dans "submittedValue", puisque c'est là qu'elle sont stockées après la phase "decode".
    Je vais tenter de voir du côté de submittedValue, je n'ai pas vu cette possibilité.

    Citation Envoyé par tchize_ Voir le message
    Pour créer un converter, un converter est unique par composant. Si vous voulez donnez dans la réutilisabilité de votre clé, mieux vaut créer un composant custom.
    Par composant custom, on entend par là une composition ?

    Citation Envoyé par tchize_ Voir le message
    PS: pourquoi utiliser des textfields? Si c'est une clé étrangère, elle est à choisir dans une liste de clés existantes -> Mieux vaut s'orienter vers un uiselectone.
    Le selectone avec 70'000 options est, je suppose, relativement peu recommandé. Et de plus, je suis censé migrer une application d'un autre langage vers Java. Le comportement doit être strictement similaire à l'ancienne application (dans un premier temps).

    Merci de la réponse

  6. #6
    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 : 40
    Localisation : Suisse

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 199
    Par défaut
    Donc, finalement je n'ai pas du tout réussi à passer par un Converter. Récupérer les valeurs par submittedValue() a parfaitement fonctionné, mais je me suis trouvé bloqué plus loin à différents niveaux. Au mieux, j'ai réussi à avoir une exécution couvrant pratiquement tous les cas, mais il en restaient qui posaient problème.

    J'ai finalement déplacé ma conversion dans la couche applicative, ce que j'aurais bien aimé éviter. Ca implique quelques magouilles au niveau de la couche web pour éviter des NPE. Dans tous les cas, ça fonctionne.

    Je vais encore tester la création d'un composant custom. Mes premiers tests n'ont pas été concluant (rien ne s'est affiché), mais je pense qu'il devrait être possible de réaliser un composant contenant plusieurs inputText et d'y associer un composant. La création de composant semble toutefois être relativement complexe (l'inverse m'aurait étonné), et si j'ai besoin d'aide je repasserai par ce sympathique forum

    Merci pour les réponses, et... à bientôt pour de nouveaux bugs !

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

Discussions similaires

  1. Calcul sur plusieurs champs similaires
    Par Zebulonn dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 25/05/2005, 14h24
  2. Réponses: 2
    Dernier message: 30/11/2004, 09h42
  3. Recherche d'un mot avec LIKE sur plusieurs champs
    Par reynhart dans le forum Langage SQL
    Réponses: 16
    Dernier message: 26/11/2004, 17h41
  4. [CR] Groupement dynamique sur plusieurs champs paramètrés
    Par CDRIK dans le forum SAP Crystal Reports
    Réponses: 8
    Dernier message: 07/06/2004, 17h55
  5. recuperer les id sur plusieurs champs
    Par matN59 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 15/03/2004, 10h23

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