0

Version: MyFaces 2.2.8ne peut pas affecter la variable d'une autre Beans avec le composant composite MyFaces

Questions: J'ai une composante composite qui attribuera une valeur pour la variable qui est passée du composite. Cela fonctionne bien dans Mojara 2.2.12 (avant de migrer vers Myfaces 2.2.8).

Ceci est mon code composite: info.xhtml

<composite:interface> 
    <composite:attribute name="id" /> 
    <composite:attribute name="methodToGetRecordFromInfo" method-signature="java.util.List action(id.co.sg.core.Dto)" required="true" /> 
    </composite:interface> 

<p:dataTable id="tblInfoCodeComponent" 
    var="codeComponent" 
    value="#{infoBean.grid}" 

    <p:columnGroup type="header"> 
     <p:row> 
      <p:column headerText="CodeComponent"/> 
     </p:row> 
    </p:columnGroup> 

    <p:column> 
      <p:commandLink value="#{codeComponent.map['componentCode']}" 
        process="@this" 
        icon="ui-icon-search" 
        update="#{infoBean.field.map['update']}"> 
      <f:setPropertyActionListener 
      value="#{infoBean.wrap(codeComponent)}" 
      target="#{cc.attrs.methodToGetRecordFromInfo}" /> 
      </p:commandLink> 
    </p:column> 

</p:dataTable> 

et c'est la méthode dans le code de haricot composite infoBean.java

public Dto wrap(Dto codeComponentRecord) { 
    Dto result = new Dto(); 

    result.putString("callerId", "callerId"); 
    result.putDto("record", codeComponentRecord.clone()); 

    return result; 
} 

Dto, était une sorte d'objet de carte qui nous utilisons pour simplifier pour nos travaux.

et voici comment nous l'utilisons dans le principal xhtml

input.xhtml

<info:codeComponentInfo id="codeComponentInfo" methodToGetRecordFromInfo="#{inputBean.selectedInfoRecord}" /> 

ce qui est le code dans inputBean.java

private Dto selectedInfoRecord; 

public void setSelectedInfoRecord(Dto infoDto){ 

    String id = infoDto.getString("callerId",""); 
     activeRow.putDto("codeComponent", infoDto.getDto("record"));    

} 

public Dto getSelectedInfoRecord() { 
    return selectedInfoRecord; 
} 

quand im MyFaces 2.2 utilisation .8, la méthode setSelectedInfoRecord n'invoque pas. donc, je ne peux pas obtenir le résultat que je choisis de l'infoBean dans le InputBean.

puis je l'ai vu cet article Pass Argument to a composite-component action attribute

donc je modifié que le code info.xhtml réel dans celui-ci

<composite:interface> 
    <composite:attribute name ="beanName" type="java.lang.Object"/> 
    <composite:attribute name ="methodName" type="java.lang.String"/> 
</composite:interface> 

... 

<f:setPropertyActionListener 
    value="#{infoBean.wrap(codeComponent)}" 
    target="#{cc.attrs.beanName[cc.attrs.methodName]}" /> 

et c'est la nouvelle input.xhtml

<info:goodsCodeComponentInfo id="goodsCodeComponentInfo" beanName="infoBean" methodName="selectedInfoRecord"/> 

mais c'est ce que j'ai trouvé

erreur BusinessExceptionHandler - $$$$$ Une exception non gérée est survenue org.apache.myfaces.view.facelets.el.ContextAwarePropertyNotFoundException: javax.el.PropertyNotFoundException: Propriété 'selectedInfoRecord' introuvable sur le type java.lang.String

puis je tente de modifier le info.xhtml dans celui-ci

<f:setPropertyActionListener 
     value="#{infoBean.wrap(codeComponent)}" 
     target="#{cc.attrs.beanName.methodName}" /> 

ou celui

<f:setPropertyActionListener 
    value="#{infoBean.wrap(codeComponent)}" 
    target="#{cc.attrs.beanName.selectedInfoRecord}" /> 

et toujours la même erreur que ci-dessus ..

donc j'essayer de nouveau une fois mod dans celui-ci

<f:setPropertyActionListener 
    value="#{infoBean.wrap(codeComponent)}" 
    target="#{inputBean.selectedInfoRecord}" /> 

Il fonctionne bien !!! mais ce n'est pas ce dont j'ai besoin, j'ai besoin de passer le nom du bean des paramètres.

quelqu'un peut m'aider à résoudre ce cas?

J'utilise Java 8 et tomcat 8.0.30 et EL 3

Répondre

2

J'ai vérifié le problème à la recherche d'un bug possible, mais il n'y a pas de bug. Au lieu de cela, c'est quelque chose lié à comprendre comment f: setPropertyActionListener fonctionne.

Cette balise définit la valeur récupérée de l'expression EL dans la propriété pointée par l'attribut "target". Si vous essayez d'appeler une méthode en utilisant l'attribut "target", cela ne fonctionnera pas, car ce n'est pas ainsi que cela a été conçu.

La bonne façon de le faire est de cette façon:

<info:codeComponentInfo bean="#{inputBean}" methodName="selectedInfoRecord"/>

Et dans le composant composite:

<cc:attribute name ="bean" type="java.lang.Object"/> 
<cc:attribute name ="methodName" type="java.lang.String"/> 
.... 
<f:setPropertyActionListener 
       value="#{infoBean.wrap(codeComponent)}" 
       target="#{cc.attrs.bean[cc.attrs.methodName]}" /> 

L'essentiel ici est que vous devez passer une référence à la haricot, et de cette façon la chaîne sera correctement résolue.