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 sur un <p:selectOneMenu/> primefaces avec deux backbean


Sujet :

JSF Java

  1. #1
    Membre averti
    Homme Profil pro
    BTS IRIS
    Inscrit en
    Juin 2013
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : BTS IRIS
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2013
    Messages : 48
    Par défaut Problème sur un <p:selectOneMenu/> primefaces avec deux backbean
    Bonjour,

    J'ai un problème au moment ou je veux submit mon formulaire ma list block l'envoie et je ne comprend pas pourquoi une idée ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     <p:selectOneMenu id="coachList" value="#{cyclistBean.c.coach}" required="false" >
                        <f:selectItem itemValue="#{null}" itemLabel=" -- " />
                        <f:selectItems value="#{coachBean.listCoach()}" var="coach" itemLabel="#{coach.firstName} - #{coach.lastName}" itemValue="#{coach}"/>
       		</p:selectOneMenu>
    "c" est un objet que je persiste une fois le formulaire validé et il a besoin d'un objet Coach que je récupère dans un second backbean. Le résultat que j'ai actuellement est l'affichage de mes coachs mais la validation du formulaire ne se fait pas. Sans cette liste le formulaire fonctionne.

  2. #2
    Membre expérimenté
    Homme Profil pro
    Développeur Java/JavaEE
    Inscrit en
    Août 2014
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur Java/JavaEE

    Informations forums :
    Inscription : Août 2014
    Messages : 194
    Par défaut
    Bonjour,

    Tu nous fourni peut d'informations. Est ce que tu rencontre une erreur lors de la validation ?? Si oui tu peux nous montrer l'erreur dans ta console et comment tu fais ta validation.

  3. #3
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    Je pense que c'est l'erreur classique, tu n'as pas mis de converter sur ton p:selectOneMenu, il ne faut pas oublier que c'est un String qui va remonter de la page...

    En passant, il est judicieux de définir les méthodes hashCode() et equals() sur ton objet Coach (de préférence sur sa clé primaire), il y a une autre problématique sinon...
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Membre averti
    Homme Profil pro
    BTS IRIS
    Inscrit en
    Juin 2013
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : BTS IRIS
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2013
    Messages : 48
    Par défaut
    Bonjour,
    merci pour vos réponse effectivement j'avais oublier de faire un converter. Cependant j'en ai fait un et cela ne marche toujours pas. J'ai essayé de debugger il passe bien dans la méthode ci-dessous il me retourne bien le bonne objet mais après ca plante. Le plus gros problème c'est que je n'est pas de message d'erreur...

    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
     
     @Override
        public Object getAsObject(FacesContext context, UIComponent component, String value) {
            if (value != null && value.trim().length() > 0) {
                try {
                    Query q = em.createQuery("SELECT c FROM Coach c WHERE c.idPeople = :id");
                    q.setParameter("id", Integer.parseInt(value));
                    c = (Coach) q.getSingleResult();
                    return c;
                } catch (NumberFormatException e) {
                    throw new ConverterException(new FacesMessage(FacesMessage.SEVERITY_ERROR, "Conversion Error", "Not a valid coach."));
                }
            } else {
                return null;
            }
        }
    christophe

  5. #5
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    Généralement, c'est une erreur dans l'une des phases apply-request, process-validations ou apply-model-values.
    Il y a peut-être un problème sur un autre champ de ta page.
    Je me suis fais une classe "PhaseListener", ça permet de surveiller un peu ce genre de chose, voici son code
    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
    51
    52
     
    /**
     * Cycle de vie d'une requête JSF
     * @author Olivier BUTTERLIN
     */
    public class LifeCycleListener implements PhaseListener
    {
        public static final long serialVersionUID = 1;
     
        public LifeCycleListener()
        {
            super();
        }
     
        public PhaseId getPhaseId()
        {
            return PhaseId.ANY_PHASE;
        }
     
        /**
         * Au début d'une phase
         */
        public void beforePhase(PhaseEvent event)
        {
            if (event.getPhaseId() == PhaseId.RESTORE_VIEW)
            {
                System.out.println(event.getPhaseId() + " --> " + event.getFacesContext().getExternalContext().getRequestServletPath());
            }
            else if (event.getPhaseId() == PhaseId.APPLY_REQUEST_VALUES)
            {
                Map<String, String> map = event.getFacesContext().getExternalContext().getRequestParameterMap();
                StringBuilder sb = new StringBuilder();
                for (String key : map.keySet())
                {
                    sb.append("      ").append(key).append(" = \"").append(map.get(key).replaceAll("\r", "").replaceAll("\n", "\\\\n")).append("\"\n");
                }
                System.out.println(event.getPhaseId() + " -->\n" + sb.toString());
            }
            else
            {
                System.out.println(event.getPhaseId());
            }
        }
     
        /**
         * A la fin d'une phase
         */
        public void afterPhase(PhaseEvent event)
        {
    //        System.out.println("\n");
        }
    }
    Tu n'as plus qu'à le préciser dans ton faces-config.xml comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        <lifecycle>
            <phase-listener>ton.package.LifeCycleListener</phase-listener> 
        </lifecycle>
    Et ça sort ces informations
    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
     
    RESTORE_VIEW 1 --> /views/compte/solde/recherche.xhtml
     
    APPLY_REQUEST_VALUES 2 -->
           form1:soldes:j_idt476 = ""
           form1:soldes:j_idt397 = ""
           form1:soldes:j_idt486 = ""
           javax.faces.source = "form1:soldes:j_idt408"
           form1:soldes:j_idt469 = ""
           form1:soldes_selection = ""
           form1:soldes:j_idt481 = ""
           form1:soldes:j_idt413 = ""
           javax.faces.partial.ajax = "true"
           form1 = "form1"
           form1:soldes:j_idt418 = ""
           javax.faces.partial.render = "form1"
           javax.faces.partial.execute = "form1:soldes:j_idt408"
           form1:soldes:j_idt408 = "13249"
           javax.faces.behavior.event = "change"
           form1:soldes_scrollState = "0,0"
           javax.faces.partial.event = "change"
           form1:j_idt524_scrollState = "0,0"
           javax.faces.ViewState = "4368052734349920000:-7919311796049580369"
     
    PROCESS_VALIDATIONS 3
     
    UPDATE_MODEL_VALUES 4
     
    INVOKE_APPLICATION 5
     
    RENDER_RESPONSE 6
    Si tu ne remontes pas jusqu'à la phase 6, c'est qu'il y a une erreur
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre averti
    Homme Profil pro
    BTS IRIS
    Inscrit en
    Juin 2013
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : BTS IRIS
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2013
    Messages : 48
    Par défaut
    Merci pour ta réponse.

    J'ai mis en place ce que vous m'avez donné et j'obtient le résultat suivant :
    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
     
    Infos:   RESTORE_VIEW 1 --> /cyclist/addCyclist.html
    Infos:   APPLY_REQUEST_VALUES 2 -->
          javax.faces.partial.ajax = "true"
          javax.faces.source = "j_idt21:j_idt32"
          javax.faces.partial.execute = "@all"
          j_idt21:j_idt32 = "j_idt21:j_idt32"
          j_idt21 = "j_idt21"
          j_idt21:j_idt22 = ""
          j_idt21:firstName = "zzed"
          j_idt21:lastName = "dee"
          j_idt21:email = "dzede"
          j_idt21:coachList_focus = ""
          j_idt21:coachList_input = "1"
          javax.faces.ViewState = "-6833597090553679490:-2696546584397647541"
    Infos:   PROCESS_VALIDATIONS 3
    Infos:   RENDER_RESPONSE 6
    Donc sachant que j'arrive à la réponse 6 je n'ai donc pas d'erreur, je peut le conclure ? Cependant cela ne marche toujours pas

  7. #7
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    C'est à interpréter au cas pas cas... il semblerait que tu ais un problème dans la phase de validation puisque tu sautes de la phase 3 à la 6, donc la validation interrompt le process (erreur de conversion ou exception renvoyée par ton code) comme tu peux le voir sur le cycle
    Nom : JSF-Lifecycle.png
Affichages : 1303
Taille : 164,4 Ko
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mars 2015
    Messages : 4
    Par défaut
    Bonjour,

    A mon avis tu dois avoir un problème de validation en niveau de ta liste deroulante.
    En effet je pense que la manière dont la liste déroulante est initialisée n'est pas bonne :

    Au niveau de <p:selectOneMenu> : la value="#{cyclistBean.c.coach}" n'est pas de type String a mon avis ?

    Essaye avec ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <p:selectOneMenu id="coachList" value="#{cyclistBean.valueCoach}" required="false" >
         <f:selectItem itemValue="#{null}" itemLabel=" -- " />
         <f:selectItems value="#{coachBean.listSelectedItemCoach()}" />
    </p:selectOneMenu>
    Dans le bean :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    // valueCoach = firstName + " - " +  lastName 
    private String valueCoach;

    Initialiser la liste :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public List listSelectedItemCoach() {
        List<SelectItem> resultat = new ArrayList<SelectItem>();
        for(Coach coach : listCoach()){    
            String itemLabel = coach.firstName  + " - "  + coach.lastName ;
            String itemValue = coach.firstName  + " - "  + coach.lastName ;
            resultat.add(new SelectItem(itemValue , itemLabel ));
        }
        return resultat ;
    }

Discussions similaires

  1. Réponses: 4
    Dernier message: 06/11/2014, 18h39
  2. Problème sur la recherche fulltext en v4 !
    Par poppa dans le forum Requêtes
    Réponses: 3
    Dernier message: 13/05/2004, 23h06
  3. Problème sur GetPrivateProfileString ???
    Par Bordelique dans le forum Langage
    Réponses: 7
    Dernier message: 25/06/2003, 22h15
  4. Problème sur une requête INSERT
    Par Marion dans le forum Langage SQL
    Réponses: 3
    Dernier message: 17/06/2003, 08h45
  5. problème sur une requête!!!!!
    Par Mcgrady_01 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 13/06/2003, 01h17

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