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 :

Richfaces : Utilisation de a4j:support dans un selectOneMenu


Sujet :

JSF Java

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 29
    Par défaut Richfaces : Utilisation de a4j:support dans un selectOneMenu
    Bonjour,

    J'essaie d'appeler une méthode lorsque la valeur d'une liste change mais j'ai un nullPointerException lorsque j'utilise le tag a4j:support. Aussi un peu d'aide ne serait pas de refus.

    Voilà ma jsp :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <h:outputText value='Gestionnaire : '/>
    <h:selectOneMenu id='selectLDAP' value="#{adminGestionnaireController.gestionnaire.uId}">
    <f:selectItems value="#{adminGestionnaireController.listeStringGestionnaireLDAP}"/>
    <a4j:support event="onchange" actionListener="#{adminGestionnaireController.test}" immediate="true"/></h:selectOneMenu>
    Et l'erreur que j'ai dès que j'arrive sur la page :

    java.lang.NullPointerException
    javax.faces.component.UIComponentBase.findComponent(UIComponentBase.java:564)
    org.ajax4jsf.component.EventValueExpression.getComponent(EventValueExpression.java:98)
    org.ajax4jsf.component.AbstractEventValueExpression.getValue(AbstractEventValueExpression.java:98)
    javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:190)
    javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:178)
    javax.faces.component.html.HtmlSelectOneMenu.getOnchange(HtmlSelectOneMenu.java:271)
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 40
    Par défaut
    Essaye plutôt ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <h:selectOneMenu id='selectLDAP' value="{adminGestionnaireController.gestionnaire.uId}" valueChangeListener="#{adminGestionnaireController.test}">
           <f:selectItems value="#{adminGestionnaireController.listeStringGestionnaireLDAP}"/>
           <a4j:support event="onchange" immediate="true" ajaxSingle="true"/>
    </h:selectOneMenu>

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 29
    Par défaut
    J'ai exactement la même erreur

    Je ne vois pas d'où ça peut venir vu que le a4j:support est encapsulé dans le UIComponent concerné...

  4. #4
    Membre éprouvé Avatar de juridakus
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Maroc

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

    Informations forums :
    Inscription : Avril 2008
    Messages : 82
    Par défaut
    Citation Envoyé par Pepps Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ...
    <a4j:support event="onchange" actionListener="#{adminGestionnaireController.test}" immediate="true"/></h:selectOneMenu>
    Et l'erreur que j'ai dès que j'arrive sur la page :
    Je crois que ton NPE est causé par "immediate=true". Si tu lis la suite de la trace d'erreur tu veras la cause généralement après "caused by..."
    Si tu veux éviter que JSF valide d'autres composants sur la page tu peux effectivement utiliser la propriété "ajaxSingle = true".

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 40
    Par défaut
    Oups, dans mon copier coller, j'ai effectivement oublié d'enlever le "immediate=true" après avoir rajouté le ajaxSingle.

    La cause de l'erreur est surement là en effet.
    Si ça ne fonctionne pas, peut-être que la trace complète du log nous aiderait

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 29
    Par défaut
    Bonjour,

    J'ai toujours la même erreur après correction du immediate="true".

    Voici la trace complète des log :

    exception

    javax.servlet.ServletException
    javax.faces.webapp.FacesServlet.service(FacesServlet.java:325)
    org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:206)
    org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:290)
    org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:388)
    org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:515)
    cause mère

    java.lang.NullPointerException
    javax.faces.component.UIComponentBase.findComponent(UIComponentBase.java:564)
    org.ajax4jsf.component.EventValueExpression.getComponent(EventValueExpression.java:98)
    org.ajax4jsf.component.AbstractEventValueExpression.getValue(AbstractEventValueExpression.java:98)
    javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:190)
    javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:178)
    javax.faces.component.html.HtmlSelectOneMenu.getOnchange(HtmlSelectOneMenu.java:271)
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    java.lang.reflect.Method.invoke(Method.java:597)
    javax.faces.component.UIComponentBase$AttributesMap.get(UIComponentBase.java:2146)
    com.sun.faces.renderkit.RenderKitUtils.renderOnchange(RenderKitUtils.java:349)
    com.sun.faces.renderkit.html_basic.MenuRenderer.renderSelect(MenuRenderer.java:859)
    com.sun.faces.renderkit.html_basic.MenuRenderer.encodeEnd(MenuRenderer.java:296)
    javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:878)
    javax.faces.component.UIComponent.encodeAll(UIComponent.java:1620)
    javax.faces.render.Renderer.encodeChildren(Renderer.java:168)
    javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:848)
    javax.faces.component.UIComponent.encodeAll(UIComponent.java:1613)
    javax.faces.render.Renderer.encodeChildren(Renderer.java:168)
    javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:848)
    org.ajax4jsf.renderkit.RendererBase.renderChild(RendererBase.java:277)
    org.ajax4jsf.renderkit.RendererBase.renderChildren(RendererBase.java:258)
    org.ajax4jsf.renderkit.html.AjaxOutputPanelRenderer.encodeChildren(AjaxOutputPanelRenderer.java:78)
    javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:848)
    org.ajax4jsf.renderkit.RendererBase.renderChild(RendererBase.java:277)
    org.ajax4jsf.renderkit.AjaxChildrenRenderer.encodeAjaxComponent(AjaxChildrenRenderer.java:166)
    org.ajax4jsf.renderkit.AjaxChildrenRenderer.encodeAjaxChildren(AjaxChildrenRenderer.java:83)
    org.ajax4jsf.renderkit.AjaxChildrenRenderer.encodeAjaxComponent(AjaxChildrenRenderer.java:157)
    org.ajax4jsf.renderkit.AjaxChildrenRenderer.encodeAjaxChildren(AjaxChildrenRenderer.java:83)
    org.ajax4jsf.renderkit.AjaxChildrenRenderer.encodeAjaxComponent(AjaxChildrenRenderer.java:157)
    org.ajax4jsf.renderkit.AjaxContainerRenderer.encodeAjax(AjaxContainerRenderer.java:124)
    org.ajax4jsf.component.AjaxViewRoot.encodeAjax(AjaxViewRoot.java:685)
    org.ajax4jsf.component.AjaxViewRoot.encodeChildren(AjaxViewRoot.java:556)
    javax.faces.component.UIComponent.encodeAll(UIComponent.java:1613)
    com.sun.faces.application.view.JspViewHandlingStrategy.doRenderView(JspViewHandlingStrategy.java:420)
    com.sun.faces.application.view.JspViewHandlingStrategy.renderView(JspViewHandlingStrategy.java:209)
    com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:126)
    org.ajax4jsf.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:100)
    org.ajax4jsf.application.AjaxViewHandler.renderView(AjaxViewHandler.java:176)
    com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:127)
    com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
    com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
    javax.faces.webapp.FacesServlet.service(FacesServlet.java:313)
    org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:206)
    org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:290)
    org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:388)
    org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:515)
    Et le code de mon modalPanel en entier :

    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
    <rich:modalPanel id="panelUbCcGestionnaire" width="650" height="450">
    	<f:facet name="header">
    		<h:outputText value="Associations UbCc du gestionnaire" />
    	</f:facet>
    	<f:facet name="controls">
    		<h:graphicImage value="../IMG/close.png"
    style="cursor:pointer"
    onclick="#{rich:component('panelUbCcGestionnaire')}.hide()" />
    	</f:facet>
    	<a4j:outputPanel id="formAfficheUbCcGestionnaire">
    	<h:form>
    	<table>
    		<tr><td>
    			<h:outputText value ="Gestionnaire : #{adminGestionnaireController.gestionnaire.nom} #{adminGestionnaireController.gestionnaire.prenom}"/>
    		</td></tr>
    		<tr><td>
    		<h:form>
    			<h:outputText value='Couple Ub/Cc : '/>
    			<h:selectOneMenu id='selectUbCc' value="#{adminGestionnaireController.my_ubcc}" valueChangeListener="#{adminGestionnaireController.testUbCc}">
    				<f:selectItems value="#{adminGestionnaireController.ubCentreDeCout}"/>
    				<a4j:support event="onchange" ajaxSingle="true"/>
    			</h:selectOneMenu>
    			<a4j:commandButton value ="Ajouter" reRender="tableUbCc"></a4j:commandButton>
    		</h:form>
    		</td></tr>
    		<tr><td>
    			<rich:scrollableDataTable id="tableUbCc" rowKeyVar="rkv"
                    width="550" columnClasses="col" rows="10" value="#{adminGestionnaireController.listeGestionnaires}" var="gestionnaire" sortMode="single">
                    </rich:scrollableDataTable>
    		</td></tr>
    	</table>	
    	</h:form> 
    	</a4j:outputPanel>
     </rich:modalPanel>

  7. #7
    Membre éprouvé Avatar de juridakus
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Maroc

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

    Informations forums :
    Inscription : Avril 2008
    Messages : 82
    Par défaut
    Je vois qu'en plus du <a4j:support event="onchange" ... /> il y a aussi un valueChangeListener est-ce que c'est pour le même appel?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ...
    <h:selectOneMenu id='selectUbCc' value="#{adminGestionnaireController.my_ubcc}" valueChangeListener="#{adminGestionnaireController.testUbCc}">
    				<f:selectItems value="#{adminGestionnaireController.ubCentreDeCout}"/>
    				<a4j:support event="onchange" ajaxSingle="true"/>
    </h:selectOneMenu>
    Sinon serait il possible de modifier ton <rich:modalPanel> pour avoir un seul formulaire <h:form> et de déplacer le <a4j:outputPanel> juste pour encapsuler le <rich:scrollableDataTable>.

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 29
    Par défaut
    Le valueChangeListener et le va4j:support event="onchange".../> sont bien là pour le même appel.

    J'ai effectué les changement que tu m'as demandé dans mon modalPanel. Ma méthode testUbCc est maintenant bien appelée mais ma valeur my_ubCc n'est pas renseignée. Je continue de chercher pour résoudre ces petits soucis.

    Voici le code de mon nouveau modalPanel :

    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
    <rich:modalPanel id="panelUbCcGestionnaire" width="650" height="450">
    		<f:facet name="header">
    			<h:outputText value="Associations UbCc du gestionnaire" />
    		</f:facet>
    		<f:facet name="controls">
    			<h:graphicImage value="../IMG/close.png" style="cursor:pointer" onclick="#{rich:component('panelUbCcGestionnaire')}.hide()" />
    		</f:facet>
     
     
    		<table>
    			<tr><td>
    				<h:outputText value ="Gestionnaire : #{adminGestionnaireController.gestionnaire.nom} #{adminGestionnaireController.gestionnaire.prenom}"/>
    			</td></tr>
    			<tr><td>
    			<h:form>
    				<h:outputText value='Couple Ub/Cc : '/>
    				<h:selectOneMenu id='selectUbCc' value="#{adminGestionnaireController.my_ubcc}" valueChangeListener="#{adminGestionnaireController.testUbCc}">
    					<f:selectItems value="#{adminGestionnaireController.ubCentreDeCout}"/>
    					<a4j:support event="onchange" ajaxSingle="true"/>
    				</h:selectOneMenu>
    				<a4j:commandButton value ="Ajouter" reRender="tableUbCc"></a4j:commandButton>
    			</h:form>
    			</td></tr>
    			<tr><td>
    			<a4j:outputPanel id="formAfficheUbCcGestionnaire">
    				 <rich:scrollableDataTable id="tableUbCc" rowKeyVar="rkv"
                    width="550" columnClasses="col" rows="10" value="#{adminGestionnaireController.listeGestionnaires}" var="gestionnaire" sortMode="single">
                    </rich:scrollableDataTable>
                    </a4j:outputPanel>
    			</td></tr>
    		</table>	
     
     
       	</rich:modalPanel>
    Merci de l'aide !

  9. #9
    Membre éprouvé Avatar de juridakus
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Maroc

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

    Informations forums :
    Inscription : Avril 2008
    Messages : 82
    Par défaut
    Citation Envoyé par Pepps Voir le message
    Le valueChangeListener et le va4j:support event="onchange".../> sont bien là pour le même appel.
    Ton <a4j:support .. /> dans ton code n'est pas utilisé... Du moins je vois qu'il n'appelle aucune méthode ni ne rafraîchit aucun composant à moins que tu aies volontairement omis quelque chose, et tu n'utilises ton bouton ajouter que pour rafraîchir le tableau... Peux tu mettre le code de ta méthode valueChangeListener (testUbCc).

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 29
    Par défaut
    En fait mon bouton ne me sert à rien pour l'instant, c'est pour ça qu'il ne fait rien.

    Si j'enlève le a4j:support, ma méthode du valueChangeListener n'est plus appelée. Cette méthode ne fait rien d'autre pour l'instant que de m'afficher qu'elle est appelée et de me donner la valeur de mon attribut my_ubcc.

    Je voudrais juste que ma méthode testUbCc soit appelée chaque fois que je change de valeur sélectionnée dans ma liste. Et que cette veleur soit affectée à mon attribut my_ubcc.

    Avec le valueChangeListener et le a4j:support, cette méthode est bien appelée à chaque changement de valeur mais my_ubcc reste null.

    En fait mon problème est simple :
    Comment fait-on pour avoir une liste et affecter la valeur choisie à un attribut de bean, et cela sans avoir à valider le formulaire ?

  11. #11
    Membre éprouvé Avatar de juridakus
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Maroc

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

    Informations forums :
    Inscription : Avril 2008
    Messages : 82
    Par défaut
    Citation Envoyé par Pepps Voir le message
    En fait mon problème est simple :
    Comment fait-on pour avoir une liste et affecter la valeur choisie à un attribut de bean, et cela sans avoir à valider le formulaire ?
    Alors tu utilises juste:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    <h:form>
    <h:outputText value='Couple Ub/Cc : '/>
    <h:selectOneMenu id='selectUbCc' value="#{adminGestionnaireController.my_ubcc}" >
    <f:selectItems value="#{adminGestionnaireController.ubCentreDeCout}"/>
    <a4j:support actionListener="#{adminGestionnaireController.testUbCc}" event="onchange" ajaxSingle="true"/>
    </h:selectOneMenu>
    <a4j:commandButton value ="Ajouter" reRender="tableUbCc"></a4j:commandButton>
    </h:form>
     
    Pour ta méthode:
    public void testUbCc (javax.faces.event.ActionEvent ev){
     ...
    }
    Cela devrait marcher.
    .

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 29
    Par défaut
    Merci beaucoup !!!
    Ca fonctionne.

    A tout hasard et si ça peut servir, pour récupérer la valeur sélectionnée dans la liste voici ma méthode testUbCc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public void testUbCc(ActionEvent arg0) throws AbortProcessingException
    	{
    		UIComponent component = FacesContext.getCurrentInstance().getViewRoot().findComponent("formSelectUbCc:selectUbCc");
    		UISelectOne selectOne = (UISelectOne)component;
     
    		my_ubcc = (String)selectOne.getValue();
    	}

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 09/05/2013, 16h19
  2. Réponses: 2
    Dernier message: 11/02/2011, 16h14
  3. Réponses: 3
    Dernier message: 11/02/2011, 09h18
  4. h:selectOneMenu, a4j:support et actionListener
    Par snipes dans le forum JSF
    Réponses: 6
    Dernier message: 18/11/2009, 16h39
  5. [Richfaces] SetRendered et a4j:support
    Par aigleborgne dans le forum JSF
    Réponses: 1
    Dernier message: 29/12/2008, 17h02

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