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 :

Erreur "INFO: WARNING: FacesMessage(s) have been enqueued, but may not have been displayed."


Sujet :

JSF Java

  1. #1
    Futur Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2011
    Messages : 18
    Points : 7
    Points
    7
    Par défaut Erreur "INFO: WARNING: FacesMessage(s) have been enqueued, but may not have been displayed."
    Bonjour,
    j'essais de rafraichir un selectOneMenu a partir d'un autre en utilisant un converter ,
    mon code jsf :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <h:outputLabel value="Missions:" ></h:outputLabel>
    	    <h:selectOneMenu value="#{missionBean.mission}" id="missionid" onchange="submit()" valueChangeListener="#{missionBean.valueChange}" converter="#{missionConverter}" immediate="true">
    		<f:selectItems value="#{missionBean.missions}"/>
     
     
     
    			</h:selectOneMenu><br>
    			<h:outputLabel value="Phases:" ></h:outputLabel>
    			<h:selectOneMenu value="#{missionBean.intitule}" id="s2"    >
    			<f:selectItems value="#{missionBean.phases}"/>
     
    			</h:selectOneMenu><br>
    mon code du converter:

    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 MissionConverter implements Converter, Serializable {
     
     
     
        public Object getAsObject(FacesContext context, UIComponent component, String value) {
        	MissionHome m = new MissionHome();
        	List<Mission> missions=m.findAll();;
        	for (Mission mission : missions) {
                if (mission.getDescription().equals(value)) {
                    return mission;
                }
            }              
            return null;
        }
     
     
        public String getAsString(FacesContext context, UIComponent component, Object value) {
        	return ((Mission) value).getDescription();
    	}
        }
    mais l'erreur c'est lors du changement de la valeur selectionnée puisque dans la récuperation de la valeur pour rafrachir le second selectonemenu me donne ce warning et le second selectonemenu reste sans changement:
    l'erreur est:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sourceId=j_id_jsp_1003224163_1:missionid[severity=(ERROR 2), summary=(j_id_jsp_1003224163_1:missionid: Erreur de validation: Valeur not valid.), detail=(j_id_jsp_1003224163_1:missionid: Erreur de validation: Valeur not valid.)]
    et pour recuperer la valeur la methode valueChange est:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public void valueChange(ValueChangeEvent e){	
    PhaseHome ph=new PhaseHome();
    Mission m=(Mission)e.getNewValue();
    System.out.println(m.getDescription());//ça marche pas, cette valeur ne se récupere pas
    setL(ph.findByMission(m));
     
    }

  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
    Ce message indique qu'un message de type FacesMessage doit être affiché, mais étant donné que les composants <h:message> ou <h:messages> permettant de l'afficher ne sont pas rafraichis, alors le message d'alerte en question n'est pas affiché à l'utilisateur.

    Le moyen le plus simple est de faire ceci (<a4j:outputPanel> provient de la librairie Richfaces, mais il y a des équivalents dans d'autres librairies) :

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <a4j:outputPanel ajaxRendered="true">
        <h:messages/>
    </a4j:outputPanel>

    Le ajaxRendered="true" indique que ce panneau (DIV ou SPAN en HTML) sera toujours rafraichit quelque soit la requête ajax. Sinon, on peut lui spécifier un id, et l'ajouter dans chaque reRender.
    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
    Futur Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2011
    Messages : 18
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par romaintaz Voir le message
    Ce message indique qu'un message de type FacesMessage doit être affiché, mais étant donné que les composants <h:message> ou <h:messages> permettant de l'afficher ne sont pas rafraichis, alors le message d'alerte en question n'est pas affiché à l'utilisateur.

    Le moyen le plus simple est de faire ceci (<a4j:outputPanel> provient de la librairie Richfaces, mais il y a des équivalents dans d'autres librairies) :

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <a4j:outputPanel ajaxRendered="true">
        <h:messages/>
    </a4j:outputPanel>

    Le ajaxRendered="true" indique que ce panneau (DIV ou SPAN en HTML) sera toujours rafraichit quelque soit la requête ajax. Sinon, on peut lui spécifier un id, et l'ajouter dans chaque reRender.
    oui ça marche bien merci mais juste pour la recuperation de la valeur selectionnée y'a toujours des problemes

  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 : 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
    Mais du coup, ça affiche un message d'erreur. Quel est il ?
    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
    Membre chevronné
    Avatar de fxrobin
    Homme Profil pro
    Architecte SI, Java Fan, API Manager
    Inscrit en
    Novembre 2007
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Architecte SI, Java Fan, API Manager
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2007
    Messages : 875
    Points : 2 112
    Points
    2 112
    Par défaut
    Re-salut,

    bien passons à la résolution de ce problème

    tu es donc en JSF 1.2 (ce qui m'a un poil compliqué la tâche et me fait dire que JSF 2.0 est vraiment bien) ...

    Voici les points clés pour réussis :
    1 - il faut générer les SelectItems pour les listes déroulantes.
    2 - il faut que les objets placés dans les SelecItems implémentent correctement EQUALS et HASHCODE
    3 - il faut bien mettre les bons attributs sur "a4j:support"
    4 - il faut passer par un BackingBean pour les valeurs de la seconde liste, dynamique. Je ne sais pas trop pourquoi, mais j'ai pas réussi sans ...

    Alors d'abord mes "Choix" seront représentés par cette classe, qu'ils soient dans le selecteur 1 ou 2 :

    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
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
     
    package demo;
     
    public class Choix
    {
     
        private long id;
        private String libelle;
     
        public Choix()
        {
        }
     
        @Override
        public boolean equals(Object obj)
        {
            if (obj == null)
            {
                return false;
            }
            if (getClass() != obj.getClass())
            {
                return false;
            }
            final Choix other = (Choix) obj;
            if (this.id != other.id)
            {
                return false;
            }
            if ((this.libelle == null) ? (other.libelle != null) : !this.libelle.equals(other.libelle))
            {
                return false;
            }
            return true;
        }
     
        @Override
        public int hashCode()
        {
            int hash = 7;
            hash = 41 * hash + (int) (this.id ^ (this.id >>> 32));
            hash = 41 * hash + (this.libelle != null ? this.libelle.hashCode() : 0);
            return hash;
        }
     
        public Choix(long id, String libelle)
        {
            this.id = id;
            this.libelle = libelle;
        }
     
        /**
         * @return the id
         */
        public long getId()
        {
            return id;
        }
     
        /**
         * @param id the id to set
         */
        public void setId(long id)
        {
            this.id = id;
        }
     
        /**
         * @return the libelle
         */
        public String getLibelle()
        {
            return libelle;
        }
     
        /**
         * @param libelle the libelle to set
         */
        public void setLibelle(String libelle)
        {
            this.libelle = libelle;
        }
     
        @Override
        public String toString()
        {
            return String.format("Choix { %d , %s}", id, libelle);
        }
    }
    ensuite j'ai codé une classe Dao "qui simule l'accès à une base de données"

    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
     
    package demo;
     
    import java.util.HashMap;
    import java.util.Map;
     
    public class ChoixDao
    {
     
        private static Map<Long, Choix> base = new HashMap<Long, Choix>();
     
        static
        {
            // Construction d'une base de choix et sous-choix
            // 5 choix de base, 5 sous-choix par choix
            for (int i = 1; i <= 5; i++)
            {
                Choix c = new Choix(i, "CHOIX " + i);
                ChoixDao.put(c);
     
                System.out.println("Choix :" + c);
     
                for (int j = 0; j < 5; j++)
                {
                    Long key = new Long(i * 10 + j);
                    String libelle = String.format("choix %d - sous-choix %d", i, j);
                    Choix sousChoix = new Choix(key, libelle);
                    ChoixDao.put(sousChoix);
                    System.out.println("Sous-Choix : " + sousChoix);
                }
            }
            // la "base" est prête
        }
     
        static void put(Choix c)
        {
            base.put(c.getId(), c);
        }
     
        static Choix get(Long id)
        {
            return base.get(id);
        }
    }
    ensuite il me faut un converter pour mes "Choix" :

    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
     
    package demo;
     
    import java.util.HashMap;
    import java.util.Map;
    import javax.faces.component.UIComponent;
    import javax.faces.context.FacesContext;
    import javax.faces.convert.Converter;
     
    public class ChoixConverter implements Converter
    {
     
        @Override
        public Object getAsObject(FacesContext context, UIComponent component, String value)
        {
            Choix c = ChoixDao.get(Long.parseLong(value));
            return c;
        }
     
        @Override
        public String getAsString(FacesContext context, UIComponent component, Object value)
        {
            Choix c = (Choix) value;
            return new Long(c.getId()).toString();
        }
    }
    converter, que je déclare dans mon faces-config.xml, accompagné du ManagedBean qui va suivre.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
        <managed-bean>
            <managed-bean-name>pageIndexBean</managed-bean-name>
            <managed-bean-class>demo.PageIndexBean</managed-bean-class>
            <managed-bean-scope>request</managed-bean-scope>
        </managed-bean>
     
        <converter>
            <converter-id>choixConverter</converter-id>
            <converter-class>demo.ChoixConverter</converter-class>
        </converter>
    ensuite, il me faut donc un ManagedBean pour ma page, les listes et les composants :

    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
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
     
    package demo;
     
    import java.util.ArrayList;
    import java.util.List;
    import javax.faces.component.UISelectItems;
    import javax.faces.model.SelectItem;
     
    public class PageIndexBean
    {
     
        private List<SelectItem> premiereListe = new ArrayList<SelectItem>();
        private UISelectItems secondSelectOneMenu;
        private Choix premierChoix;
        private Choix secondChoix;
     
        private SelectItem generateSelectItem(Choix c)
        {
            return new SelectItem(c, c.getLibelle());
        }
     
        public PageIndexBean()
        {
            // on peuple la première liste en fonction de la DAO
            // avec les 5 premiers choix de premier niveau
            for (long index = 1; index <= 5; index++)
            {
                premiereListe.add(this.generateSelectItem(ChoixDao.get(index)));
            }
        }
     
        /**
         * @return the premiereListe
         */
        public List<SelectItem> getPremiereListe()
        {
            return premiereListe;
        }
     
        /**
         * @param premiereListe the premiereListe to set
         */
        public void setPremiereListe(List<SelectItem> premiereListe)
        {
            this.premiereListe = premiereListe;
        }
     
        public void updateSecondeListeChoix(javax.faces.event.ActionEvent event)
        {
            // on construit dynamiquement la liste en fonction
            // du premier choix
     
            List<SelectItem> secondeListe = new ArrayList<SelectItem>();
            secondSelectOneMenu.setValue(secondeListe);
     
            // peuplement de la liste
            long startIndex = premierChoix.getId() * 10;
            for (long index = startIndex; index < startIndex + 5; index++)
            {
                secondeListe.add(this.generateSelectItem(ChoixDao.get(index)));
            }
        }
     
        public void doTheJob()
        {
            System.out.println("Choix       : " + getPremierChoix());
            System.out.println("Sous-Choix  : " + getSecondChoix());
        }
     
        /**
         * @return the premierChoix
         */
        public Choix getPremierChoix()
        {
            return premierChoix;
        }
     
        /**
         * @param premierChoix the premierChoix to set
         */
        public void setPremierChoix(Choix premierChoix)
        {
            this.premierChoix = premierChoix;
        }
     
        /**
         * @return the secondChoix
         */
        public Choix getSecondChoix()
        {
            return secondChoix;
        }
     
        /**
         * @param secondChoix the secondChoix to set
         */
        public void setSecondChoix(Choix secondChoix)
        {
            this.secondChoix = secondChoix;
        }
     
        /**
         * @return the secondSelectOneMenu
         */
        public UISelectItems getSecondSelectOneMenu()
        {
            return secondSelectOneMenu;
        }
     
        /**
         * @param secondSelectOneMenu the secondSelectOneMenu to set
         */
        public void setSecondSelectOneMenu(UISelectItems secondSelectOneMenu)
        {
            this.secondSelectOneMenu = secondSelectOneMenu;
        }
    }
    et enfin la page JSF 1.2, avec ce qu'il faut, là où il faut (y'a encore qqs petits trucs à paufiner ... mais ça marche et la démarche y est) :

    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
     
    <%@page contentType="text/html" pageEncoding="UTF-8"%>
     
    <%@taglib prefix="f" uri="http://java.sun.com/jsf/core"%>
    <%@taglib prefix="h" uri="http://java.sun.com/jsf/html"%>
    <%@taglib prefix="a4j" uri="https://ajax4jsf.dev.java.net/ajax"%>
     
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
        "http://www.w3.org/TR/html4/loose.dtd">
     
    <f:view>
        <html>
            <head>
                <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
                <title>Démo double selector avec rafraichissement AJAX - fxrobin</title>
            </head>
            <body>
                <h:form id="premierForm">
                    <h:selectOneMenu id="premierSelecteur"
                                     value="#{pageIndexBean.premierChoix}" 
                                     converter="choixConverter">
     
                        <f:selectItems value="#{pageIndexBean.premiereListe}"  />
                        <a4j:support event="onchange" 
                                     reRender="secondSelecteur"
                                     actionListener="#{pageIndexBean.updateSecondeListeChoix}"
                                     ajaxSingle="true">
                        </a4j:support>
                    </h:selectOneMenu>  
     
                    <h:selectOneMenu id="secondSelecteur" 
                                     value="#{pageIndexBean.secondChoix}"                                      
                                     converter="choixConverter" 
                                     rendered="true" >
                        <f:selectItems binding="#{pageIndexBean.secondSelectOneMenu}" />
     
                    </h:selectOneMenu>
     
                    <h:commandButton actionListener="#{pageIndexBean.doTheJob}" value="Traiter !" />
     
                    <h:messages />
     
                </h:form>
            </body>
        </html>
    </f:view>
    Et voilà.

    si tu veux le projet en entier, envoie moi ton email en MP et je te l'enverrai.

    PS : je le redis, qu'est-ce que c'est chiant JSF 1.2
    Moins on code, moins il y a de bug ... et vice-versa ainsi qu'inversement ...

Discussions similaires

  1. Réponses: 2
    Dernier message: 08/10/2012, 20h07
  2. Réponses: 1
    Dernier message: 06/10/2011, 11h41
  3. Réponses: 3
    Dernier message: 03/05/2010, 18h12
  4. [WS 2003] Ris message erreur you may not have sufficient permissions
    Par y.menard77 dans le forum Windows Serveur
    Réponses: 0
    Dernier message: 16/01/2010, 21h26
  5. erreur:The local variable may not have been initialized
    Par wiss20000 dans le forum Langage
    Réponses: 7
    Dernier message: 22/03/2007, 15h18

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