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

Spring Web Java Discussion :

[Spring MVC] Liste déroulante dans un formulaire.


Sujet :

Spring Web Java

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Juillet 2003
    Messages : 43
    Points : 35
    Points
    35
    Par défaut [Spring MVC] Liste déroulante dans un formulaire.
    Bonjour,

    J'utilise Spring MVC avec appFuse.
    Dans une de mes pages je veux utiliser une liste d'utilisateur, dans mon controlleur j'ai surcharger referenceData :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    @Override
    @SuppressWarnings("unchecked")
    protected Map referenceData(HttpServletRequest request) throws Exception {
     log.debug("entering 'refenceData' function ..." );
     Map model = new HashMap();
     List<User> directeurs = getUserManager().getUsers(new User());
     model.put( "directeurs", directeurs );
     return model;
    }
    dans ma jsp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <li>
      <form:select path="directeur" itemValue="id" itemLabel="lastName" items="${directeurs}"  ></form:select>
      <p><appfuse:label key="entreprise.directeur"/></p>
    </li>
    la liste se charge correctement mais quand j'enregistre j'ai cette erreur :

    -----------------------
    Failed to convert property value of type [java.lang.String] to required type [org.appfuse.model.User] for property directeur; nested exception is java.lang.IllegalArgumentException: Cannot convert value of type [java.lang.String] to required type [org.appfuse.model.User] for property directeur: no matching editors or conversion strategy found
    -----------------------

    Je ne vois pas bien ce qu'il faut faire...
    Si quelqu'un peut me mettre sur la piste.

    Merci. Julien C.

  2. #2
    Rédacteur
    Avatar de Hikage
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 177
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 177
    Points : 6 301
    Points
    6 301
    Par défaut
    En fait, le problème est qu'au niveau d'un formulaire web de manière général, toute information est stockée sous forme de chaine de caractère

    Que ce soit un entier ( "2", "3"), un date, ou même un objet personel.

    Dans ton cas, tu spécifie a Spring MVC d'utiliser l'id d'un objet Directeur ( je suppose ) comme "clé" dans le formulaire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      <form:select path="directeur" itemValue="id" itemLabel="lastName" items="${directeurs}"  ></form:select>
    Et je présume que le "directeur" que tu spécifie dans le "path" est un objet directeur justement.

    Lors du binding, si aucune configuration n'est réalisée, Spring ne sait pas recréer tout seul l'objet directeur a partir d'un ID.

    D'ou ton erreur :-)

    Pour résoudre cela, il faut :

    • Soit récupérer l'ID sous forme de chaine de caractère dans ton objet Command
    • Soit créer un Binder et l'enregistrer dans ton controlleur


    La première est plus "simple", mais tu dois dans ton controller modifier ou adapter tes méthodes pour ne plus travailler directement avec l'objet Directeur (ou bien le récupérer via son ID )

    La deuxième est un peu plus complexe, mais te fourni l'avantage de travailler directement sur un objet dans tes méthodes de ton controller.


    Je pense que ce principe est expliqué dans cet article : http://tahe.ftp-developpez.com/fichi...springmvc2.pdf
    ( avec un exemple avec des dates si je ne me trompe pas )
    Hikage
    SCJP / SCWCD & SCWSJD Certified / Spring Framework Certified
    [Personal Web] [CV]

    F.A.Q Spring Framework - Participez !

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Juillet 2003
    Messages : 43
    Points : 35
    Points
    35
    Par défaut
    merci pour ta réponse.
    c'est bon ca fonctionne. c'était effectivement un pb de "binding"


    --------------------------------------
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    @Entity
    public class Entreprise implements java.io.Serializable {
    ...
     @ManyToOne
     @JoinColumn(name="USER_ID", insertable=true, updatable=true
     public User getDirecteur() {
       return directeur;
     }
    ...
    }
    --------------------------------------

    the controller :
    --------------------------------------
    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
     
    public class EntrepriseFormController extends BaseFormController {
    ...
       @Override
       @SuppressWarnings("unchecked")
       protected Map referenceData(HttpServletRequest request) throws Exception {
           log.debug("entering 'refenceData' function ..." );
           Map model = new HashMap();
           List<User> directeurs = getUserManager().getUsers(new User());
           model.put( "directeurs", directeurs );
           return model;
       }
     
       @Override
       protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) {
           super.initBinder(request, binder);
           binder.registerCustomEditor( User.class, new UserEditor(getUserManager()) );
       }
    ...
    }
    --------------------------------------

    UserEditor
    --------------------------------------
    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
     
    package webapp.binder;
     
    import java.beans.PropertyEditorSupport;
    import org.appfuse.model.User;
    import org.appfuse.service.UserManager;
    import org.apache.commons.logging.Log;
    import org.apache.commons.logging.LogFactory;
     
    /**
    *
    * @author Julien Chanséaume
    */
    public class UserEditor extends PropertyEditorSupport {
         private final UserManager userManager;
       protected final transient Log log = LogFactory.getLog(getClass());
         public UserEditor(UserManager userManager) throws IllegalArgumentException {
           this.userManager = userManager;
       }
     
      /**
       * Format a String to a User
       */
      @Override
       public void setAsText(String text) throws IllegalArgumentException {
                 log.debug("entering UserEditor.setAsText function : " + text );
           Long id = null;
           User user = null;
                 if (text != null && text.length() > 0) {
               try {
                   id = new Long(text); // new Integer(text);
               } catch (NumberFormatException nfe) {
                   throw new IllegalArgumentException("wrong argument: id="+text, nfe);
               }
                         user = userManager.getUser(id.toString());
               /*
               if (user == null) log.warn("user.getUser(" + text + ") retrn null value");
               else log.debug("user has been find : " + user.toString());
               */
           }
           this.setValue(user);
       }
     
      /**
       * Format the Number as String
       */
       public String getAsText() {
           return getValue().toString();
       }
      }
    --------------------------------------

    my jsp
    --------------------------------------
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    ...
    <form:form commandName="entreprise" method="post" action="entrepriseform.html" id="entrepriseForm" onsubmit="return validateEntreprise(this)">
    ...
       <li>
           <form:select path="directeur" itemValue="id" itemLabel="lastName" items="${directeurs}"  ></form:select>
           <p><appfuse:label key="entreprise.directeur"/></p>
       </li>
    ...
    </form:form>
    ...
    --------------------------------------

    Julien Chanséaume.

  4. #4
    Rédacteur
    Avatar de Hikage
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 177
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 177
    Points : 6 301
    Points
    6 301
    Par défaut
    Content pour toi que cela marche.

    N'oublie pas le tag résolu ;-)
    Hikage
    SCJP / SCWCD & SCWSJD Certified / Spring Framework Certified
    [Personal Web] [CV]

    F.A.Q Spring Framework - Participez !

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 16/04/2016, 12h36
  2. [MySQL] Renseigner une liste déroulante dans un formulaire en faisant une jointure.
    Par bilou95 dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 16/10/2006, 10h12
  3. Réponses: 5
    Dernier message: 27/08/2006, 14h18
  4. recherche par liste déroulante dans un formulaire
    Par toto10 dans le forum Access
    Réponses: 13
    Dernier message: 07/07/2006, 16h49
  5. Pb de liste déroulante dans un formulaire
    Par darkian dans le forum Access
    Réponses: 2
    Dernier message: 27/12/2005, 13h22

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