0

Версия: 2.2.8 MyFacesНевозможно назначить переменную из другого Фасоль с компонентом композиционного материала в MyFaces

Вопросы: У меня есть некоторый составной компонент, который будет назначать некоторое значение переменной, которая передается из композита. Это хорошо работает в Мохаре 2.2.12 (до перехода на Myfaces 2.2.8).

Это мой композиционный код: 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> 

и это метод в коде композит боба infoBean.java

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

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

    return result; 
} 

Dto, был какой-то объект карты, который мы используем для упрощения наших работ.

и это, как мы используем его в основном XHTML

input.xhtml

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

и это код в 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; 
} 

, когда им MyFaces использование 2.2 .8, метод setSelectedInfoRecord не вызывает. так, я не могу получить результат, который я выбираю из infoBean в inputBean.

, а затем я увидел эту статью Pass Argument to a composite-component action attribute

так я модифицированную, что фактический код info.xhtml в одну эту

<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]}" /> 

и это новый input.xhtml

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

но это то, что я нашел

ОШИБКА BusinessExceptionHandler - $$$$$ необработанное исключение произошло org.apache.myfaces.view.facelets.el.ContextAwarePropertyNotFoundException: javax.el.PropertyNotFoundException: Свойство 'selectedInfoRecord' не найден по типу java.lang.String

, а затем я пытаюсь изменить info.xhtml в одну эту

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

или это один

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

и до сих пор имеет такую ​​же ошибку, как указано выше ..

поэтому я стараюсь модник его еще раз в этот один

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

Он хорошо работает !!! но это не то, что мне нужно, мне нужно передать имя компонента из параметров.

Кто-нибудь может помочь мне решить этот случай?

Я использую Java 8 и 8.0.30 и кот EL 3

ответ

2

Я проверил эту проблему в поисках возможной ошибки, но не ошибка. Вместо этого это связано с пониманием того, как работает f: setPropertyActionListener.

Этот тег устанавливает значение, полученное из выражения EL, в свойство, указанное атрибутом «target». Если вы попытаетесь вызвать метод с использованием атрибута «target», это не сработает, потому что это не так, как он был разработан.

Правильный способ сделать это таким образом:

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

И в композитном компоненте:

<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]}" /> 

Главное здесь вы должны передать ссылку на bean, и таким образом цепочка будет правильно решена.

Смежные вопросы