在我的复合组件中,我迭代list<list<javaDetailClass>>
。我通过<h:commandButon>
之类的值表达式获取了#{iterator.value}
属性的所有值。但问题来自属性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。构造函数只是创建了五个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属性
来调用复合词答案 0 :(得分: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>