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 :

p:growl : problème d'affichage de messages suite à update


Sujet :

JSF Java

  1. #1
    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 p:growl : problème d'affichage de messages suite à update
    Bonjour à tous,

    J'ai un problème que je n'arrive pas à contourner avec le composant de primefaces <p:growl> dans l'exemple suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <util:foreignKey-depot id="depot" value="#{devisManager.dtoDevis.depot}" filterDateValidite="#{devisManager.today}" readOnly="#{devisManager.readonly}">
        <p:ajax event="change" process="depot" update=":form1:tabview:devise1 :form1:tabview:devise2 :form1:tabview:devise3 :form1:tabview:devise4"/>
    </util:foreignKey-depot>
    Voici le contexte :
    - <util:foreignKey-depot> est un composite component qui peut, en cas d'erreur, envoyer un message qui sera afficher par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <p:growl id="messages" autoUpdate="true" redisplay="true" showDetail="true" showSummary="false" sticky="true" life="60000" escape="false"/>
    Le composant seul fonctionne parfaitement mais dès que je rajoute une requête ajax (<p:ajax ....>) => problème
    Le message apparait une fraction de seconde et s'efface, je suppose que la requête ajax fait se rafraichir le composant <p:growl> et comme le précédent message a déjà été traité, il disparait.

    Si quelqu'un a une astuce, je suis preneur
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  2. #2
    Membre averti
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Juillet 2015
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Juillet 2015
    Messages : 62
    Par défaut
    Bonjour OButterlin.

    Ne réussissant pas à reproduire ce problème je vais partir de constat par rapport aux informations postées.

    1 - Je ne comprend pas ce que tu souhaite faire en rafraîchissant ton composant depuis lui même.
    Normalement une requête via p:ajax (dans ce contexte) est faite pour rafraîchir un autre composant.

    Par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
                <h:panelGrid columns="3" cellpadding="5">
                    <h:outputText value="KeyUp: " />
                    <p:inputText id="firstname" value="#{userView.firstname}">
                        <p:ajax event="keyup" update="out1" />
                    </p:inputText>
                    <h:outputText id="out1" value="#{userView.firstname}" />
                </h:panelGrid>
    Je ne dit pas que c'est bien où mal ce que tu fais juste que je ne comprend pas la logique (ce qui aide pas pour t'aider ;-) )

    2 -
    Le message apparait une fraction de seconde et s'efface, je suppose que la requête ajax fait se rafraichir le composant <p:growl> et comme le précédent message a déjà été traité, il disparait.
    Je ne pense pas au vu de ton code que le problème provient de là

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <util:foreignKey-depot id="depot" value="#{devisManager.dtoDevis.depot}" filterDateValidite="#{devisManager.today}" readOnly="#{devisManager.readonly}">
        <p:ajax event="change" process="depot" update=":form1:tabview:devise1 :form1:tabview:devise2 :form1:tabview:devise3 :form1:tabview:devise4"/>
    </util:foreignKey-depot>
    Tu n'update pas directement le formulaire qui contient le composant growl donc, pour moi, ce n'est pas à ce niveau que provient le problème.

    Peux tu fournir un code minimal qui permettrait de reproduire l'anomalie ? (la ça fait 2 heures que j'essaye et je vais finir par me tirer les cheveux lol)
    Egalement quel est ta version de JSF + primefaces ?

  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
    Bonjour L4goon et merci d'avoir pris de ton temps (mais ne t'arrache pas les cheveux )

    J'utilise JSF 2.1 et PrimeFaces 5.1.0, un serveur JBoss 7.1

    Alors, pour préciser un peu le contexte, mes composites ont la charge de gérer l'affichage et la sélection de clés étrangères (tu peux regarder le principe dans le tutoriel que j'ai fait ici)
    Ces composants se chargent de mettre à jour l'objet <p:growl> (chose qui n'apparait pas dans mon tutoriel) en cas d'erreur.
    Le composant <growl> est en mode "autoUpdate=true".
    On peut (comme c'est le cas pour mon problème) lié le composant à un événement "change" pour faire des mises à jour connexes, soit de l'update, soit un traitement lourd via listener.

    Dans CE contexte uniquement, il semblerait que le traitement lié à l'update (qui met à jour d'autres champs de la page) déclenche une nouvelle mise à jour du composant <growl>.
    Comme ce n'est plus la même requête que celle qui a mis à jour mon composant, l'ancien message d'erreur disparait.
    Si je supprimais l'autoUpdate, le message resterait mais je serais obligé de trouver un autre moyen pour mettre à jour le composant <growl>.

    Bref, du niveau d'analyse du problème que j'ai, le problème est lié au fait qu'à priori, à chaque request, le composant <growl> est mis à jour (en mode "autoUpdate").

    J'espère que c'est plus clair pour toi, s'il te manque des informations, n'hésite pas à me demander. Dans tous les cas, j'essayerai de faire un petit projet pour que tu puisses reproduire le problème ce week-end.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    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
    Pour info, je viens de trouver une parade à mon problème, pas forcément optimale mais pour l'instant, je n'ai pas mieux.

    J'ai ajouté l'attribut ignoreAutoUpdate="true" à la deuxième requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <util:foreignKey-depot id="depot" value="#{devisManager.dtoDevis.depot}" filterDateValidite="#{devisManager.today}" readOnly="#{devisManager.readonly}">
        <p:ajax event="change" process="depot" ignoreAutoUpdate="true" update=":form1:tabview:devise1 :form1:tabview:devise2 :form1:tabview:devise3 :form1:tabview:devise4"/>
    </util:foreignKey-depot>
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre averti
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Juillet 2015
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Juillet 2015
    Messages : 62
    Par défaut
    qui met à jour d'autres champs de la page
    Voila la petite info qui m'a fait tilter ^^
    Je comprend beaucoup mieux le problème surtout en décortiquant un peu ton tuto.

    Ton composant, si il suit la même logique que ton tuto, implémente donc sa propre logique de communication

    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
     
        /**
         * Envoyer un message d'application
         * @param target
         * @param message
         */
        public void sendFacesMessage(String target, FacesMessage message)
        {
            if (message != null)
            {
                FacesContext facesContext = FacesContext.getCurrentInstance();
                facesContext.getExternalContext().getFlash().setKeepMessages(true);
                facesContext.addMessage(target, message);
            }
        }
    Il doit capter le rafraîchissement des autres éléments de ta page et donc effacer le message précédant sans même tenir compte des messages.

    Bon j'arrête d'enfoncer des portes ouvertes, voici les solutions que je tenterai :
    1 - Mettre un deuxième growl uniquement pour le composant perso (solution pas top)
    2 - Mettre un ignoreAutoUpdate="true" sur la requete ajax pour ne pas detecter l'évenement comme déclancheur de l'autoUpdate.

    Ps : Au passage bravo pour ton tuto !
    Les composites component et les custum component sont trop rarement abordés sur la toile

  6. #6
    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
    Citation Envoyé par L4goon Voir le message
    Ps : Au passage bravo pour ton tuto !
    Les composites component et les custum component sont trop rarement abordés sur la toile
    Merci

    C'est vrai que c'est rarement mis en avant alors que de mon point de vu, c'est d'une puissance et d'une simplicité incomparable.
    J'en ai développé une palette complète et avec l'externalisation (que je n'ai pas encore abordée dans un tuto), c'est assez géant.
    On met le jar dans la /WEB-INF/lib et hop, on utilise...

    J'ai trouvé les mêmes solutions que toi, la dernière (toute fraiche) fonctionne, le growl spécifique n'avait pas fonctionné...
    Il faut que je teste encore le cas d'un validator externe, ou alors il faudra que je trouve un autre moyen d'envoyer les messages d'erreurs.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

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

Discussions similaires

  1. Problème d'affichage de message Hello word avec Codeblocks
    Par B.M.W83 dans le forum Code::Blocks
    Réponses: 1
    Dernier message: 17/04/2014, 01h23
  2. Réponses: 6
    Dernier message: 28/02/2014, 11h56
  3. Probléme d'affichage de message
    Par Sega24 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 08/06/2009, 01h26
  4. problème d'affichage de message box
    Par webgig2002 dans le forum VB.NET
    Réponses: 1
    Dernier message: 01/08/2008, 16h57
  5. Réponses: 2
    Dernier message: 23/08/2006, 10h05

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