私の複合コンポーネントでは、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 属性に代入することで、単純にコンポジットを呼び出します。