2010-12-08 31 views
3

J'ai un composant composite JSF qui est une liste d'adresses e-mail qui peuvent être ajoutées dynamiquement, et supprimés de:JSF2 expression composite de cc.attrs ne pas évaluer les paramètres d'action correctement

<composite:interface shortDescription="Display party email addresses"> 
    <composite:attribute name="addressable" required="true"/> 
</composite:interface> 

<composite:implementation> 
    <h:panelGroup layout="block" id="emails"> 
     <h:dataTable id="emailList" value="#{cc.attrs.addressable.emailAddresses}" var="email" styleClass="data-list small-list" cellpadding="0" cellspacing="0"> 
      <h:column> 
       <f:facet name="header">Address</f:facet> 
       <h:inputText id="emailAddress" value="#{email.address}" size="30" maxlength="100" required="true" label="Email"/> 
      </h:column> 
      <h:column> 
       <f:facet name="header">Description</f:facet> 
       <h:inputText id="emailDescription" value="#{email.description}" size="20" maxlength="100"/> 
      </h:column>   
      <h:column> 
       <f:facet name="header"> 
        <h:panelGroup styleClass="right-align" layout="block"> 
         <h:commandLink id="addEmail" action="#{cc.attrs.addressable.addEmailAddress}" title="Add an email address"> 
          <f:ajax execute=":#{cc.clientId}:emails" render=":#{cc.clientId}:emails"/> 
          <h:graphicImage library="images" name="add.png" id="emailAddImg"/> 
         </h:commandLink> 
        </h:panelGroup> 
       </f:facet> 
       <h:commandLink id="deleteEmail" action="#{cc.attrs.addressable.remove(email)}" title="Remove the email from this row"> 
        <f:ajax execute=":#{cc.clientId}:emails" render=":#{cc.clientId}:emails"/> 
        <h:graphicImage library="images" name="delete.png" id="emailDeleteImg"/> 
       </h:commandLink> 
      </h:column>   
     </h:dataTable> 
    </h:panelGroup> 
</composite:implementation> 

Ce composant est utilisé comme suit:

<edit:emailAddresses addressable="#{personAddressable}" id="emailAddresses"/> 

Lorsque l'action 'deleteEmail' est invoquée, il provoque une exception:

erreur [S TDERR] Causée par: javax.el.MethodNotFoundException: /resources/edit/emailAddresses.xhtml @ 34,130 action = "# {cc.attrs.addressable.remove (email)}": Méthode non trouvée: vue No-Interface pour le point final [ jboss.j2ee: pot = tephra.war, name = PersonAddressable, service = EJB3] et une session 3j011-mgweoj-ghfwhlvv-1-ghfy2e5j-e1.remove()

Toutefois, si l'action est changé en personAddressable. enlever (email) ça marche! Cela semble être une simple substitution de paramètres et ne devrait pas faire de différence. L'action pour ajouter une adresse e-mail, qui n'a pas de paramètre, fonctionne correctement.

Je ne publierai pas le code pour le bean backing car j'ai prouvé que cela fonctionne. Mais à titre de référence, il s'agit d'une conversation stateful scoped bean (CDI). J'utilise JBoss AS6-M5 qui utilise le 2.2.

+0

Quelle implémentation JSF/version? – BalusC

+0

Mojarra 2.0.2-FCS selon jar-versions.xml. Bon point cependant. Je pourrais essayer d'obtenir le dernier et le meilleur pour voir si cela aide. – Andrew

+0

En fait, juste mis à niveau vers JBoss6-CR1 qui a Mojarra 2.0.3 et MyFaces 2.0.1. Aucune de ces implémentations n'a résolu le problème. Cela ne me surprend guère car l'implémentation de jboss-el est la même pour M5 et CR1 (1.0_02.CR2). – Andrew

Répondre

4

Je pourrais reproduire le problème sur Tomcat 7.0.5, mais pas sur Glassfish 3.0.1. Cela signifie qu'il y a un bug dans l'implémentation EL de Tomcat. J'ai signalé un bug à ce sujet: Tomcat Bug 50449.

Puisque JBoss est sous les couvertures en utilisant une fourche de Tomcat, il n'est pas surprenant que le même bug puisse également se manifester dans JBoss.

Vous pouvez (temporairement) contourner ce problème en utilisant f:setPropertyActionListener à la place.

<h:commandLink action="#{cc.attrs.addressable.remove}"> 
    <f:setPropertyActionListener target="#{cc.attrs.addressable.email}" value="#{email}" /> 

en combinaison avec une propriété email dans la fève Addressable, avec au moins un poseur.

+0

Bon sleuthing. Merci de mettre l'effort pour enquêter là-dessus. Rien à faire mais attendre une solution ou contourner le problème. – Andrew

+0

De rien. J'ai posté une solution de contournement. – BalusC

+0

Ils l'ont * enfin * corrigé: https://issues.apache.org/bugzilla/show_bug.cgi?id=52445 Il sera disponible dans Tomcat 7.0.24. Merci à cette question, j'ai re-posté le rapport de bug: http://stackoverflow.com/questions/8795009/cannot-pass-arguments-to-a-method-through-el-javax-el-methodnotfoundexception – BalusC