我正在尝试构建一个复合JSF组件,并且在调用方法时遇到了一些麻烦。我的组件中有几个输入和一个add按钮,负责向提供重复的列表中添加更多对象。我希望该按钮根据负责其所负责的页面的Managed Bean调用不同的方法(因此它应该是每个xhtml中设置的变量)。但每次我按下按钮,我得到异常消息:
类'com.test. test. 'TestMB'没有'addAction'属性。
这是我的组件:
<composite:interface>
<composite:attribute name="id" required="false" />
<composite:attribute name="value" required="true" />
<composite:attribute name="addAction" required="true" />
</composite:interface>
<composite:implementation>
<ui:repeat value="#{cc.attrs.value}" >
<!-- some inputs and other components -->
</ui:repeat>
<p:commandButton actionListener="#{cc.attrs.addAction}" />
</composite>
这是我的实现:
<cc:compositecomp id="component"
value="#{testMB.list}"
addAction="#{pessoaJuridicaMB.addToListMethod}" />
我的TestMB类不仅包含方法,而且如果我将按钮更改为:
<p:commandButton actionListener="#{testMB.addToListMethod}" />
addToListMethod非常简单:
public void addToListMethod() {
list.add(model); }
知道什么是错的,我该如何解决它吗?
您必须在接口定义中将method-signature
属性添加到addAction
属性。所以替换这个:
<composite:attribute name="addAction" required="true" />
由:<composite:attribute name="addAction" required="true"
method-signature="void addAction(javax.faces.event.ActionEvent)" />
有一些东西需要添加lametaweb的答案,至少在我的情况下,我将在这里解释它,以防其他人有同样的问题:我得到了wrong number of arguments
异常。事情是一个actionListener总是传递一个ActionEvent
对象作为它调用的方法的参数和lametaweb固定我的代码的方式,我告诉该方法不会传递任何参数。所以我必须在这里修复两件事:在method-signature
中声明一个ActionEvent
参数,并显式地将该对象作为我的void方法的接收参数,这样它们就会匹配发送/接收的参数数量,即使我不打算在我的方法中使用ActionEvent
。
复合行最后的代码必须是:
<composite:attribute name="addAction" required="true"
method-signature="void addAction(javax.faces.event.ActionEvent)" />
和我的方法
public void addToListMethod(ActionEvent event) {
list.add(model);
}