3

私の複合コンポーネントでは、list<list<javaDetailClass>>. のような値式を使用して、すべての<h:commandButon>属性の値を取得します#{iterator.value}。しかし問題は attributeactionにあり、 action は のみを受け入れますmethod expression。一方、そこには値式しか割り当てることができず、結果としてMethodNotFoundException

<cc:interface>
    <cc:attribute name="formElements" />
</cc:interface>
<cc:implementation>
    <c:forEach items="#{cc.attrs.formElements}" var="element">
        <c:forEach items="#{element}" var="iterator">

                <h:commandButton id="#{iterator.id}" 
                value="#{iterator.value}"

                action="#{iterator.action}">

                </h:commandButton>
        </c:forEach>
  </c:forEach>
</cc:implementation>

誰でもこれを修正するのを手伝ってもらえますか? 前もって感謝します。

アップデート

これは私の状況では詳細クラスになります。

package com.stackoverflow.test;

public class TestData {

/*Properties based on the implementation of your composite.
Change type where it is needed*/
private String id; 
private String value; 
private String attributeName; 
private String action; 

public TestData() {
}

/*Getters and setters omitted*/


}

Bean.java は単に ArrayList の ArrayList を保持します。コンストラクターは単純に 5 つの TestData オブジェクトを作成し、その属性に既定値を割り当てます。

package com.stackoverflow.test;

import java.util.ArrayList;
import javax.faces.bean.*; 

@ManagedBean
@RequestScoped
public class Bean {

private ArrayList<ArrayList<TestData>> list = new ArrayList<ArrayList<TestData>>(); 

public Bean() {
    ArrayList<TestData> testDataList = new ArrayList<TestData>(); 
    TestData data; 

    for(int i = 0; i < 5; i++) { 
        data = new TestData(); 
        data.setId("ID" + i);
        data.setValue("VALUE" + i);
        data.setAttributeName("ATTRIBUTE" + i);
        /**this sets the action attribute of TestData with a API from some other managed bean**/
        data.setAction("someOtherManagedbean.someactionAPI");
        testDataList.add(data);
    }

    list.add(testDataList); 
}

public ArrayList<ArrayList<TestData>> getList() {
    return list;
}

public void setList(ArrayList<ArrayList<TestData>> list) {
    this.list = list;
}

}

index.html は、"#{bean.list} の値を name 属性に代入することで、単純にコンポジットを呼び出します。

4

1 に答える 1

1

私はあなたTestData.javaが次の方法を持っていると仮定していますpublic String getAction()(私が見ているのでsetAction(String)public String action(). したがって、属性MethodNotFoundExceptionに間違ったメソッド名を指定しているためです。actionあなたの場合、それはすべきではiterator.getActionありませんiterator.action。属性が値式を想定している場合にのみ、省略名を指定します。以下のインターフェースが変更されました。

    <cc:interface>
        <cc:attribute name="formElements" />
    </cc:interface>

    <cc:implementation>
        <c:forEach items="#{cc.attrs.formElements}" var="element">
            <c:forEach items="#{element}" var="iterator">
                <h:commandButton id="#{iterator.id}" 
                                 value="#{iterator.value}"

                                 action="#{iterator.getAction}">
                </h:commandButton>
            </c:forEach>
        </c:forEach>
    </cc:implementation>
于 2013-07-01T10:41:49.390 に答える