在JSF中分配'value expression'来代替'method expression'

时间:2013-06-17 10:10:01

标签: jsf action el commandbutton

在我的复合组件中,我迭代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属性

来调用复合词

1 个答案:

答案 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>