从复合组件调用void方法

时间:2015-09-22 21:17:49

标签: jsf actionlistener composite-component commandbutton methodexpression

我正在尝试构建一个复合JSF组件,而且我在调用方法时遇到了一些麻烦。我的组件在a内部有一些输入,一个添加按钮负责添加更多对象。我希望该按钮根据负责其负责的页面的Managed Bean调用不同的方法(因此它应该是每个xhtml中设置的变量)。但每次按下按钮,我都会收到异常消息:

  

班级' com.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); }

任何错误的想法,我该如何解决?

2 个答案:

答案 0 :(得分:3)

您必须将method-signature属性添加到接口定义中的addAction属性。所以替换这个:

<composite:attribute name="addAction" required="true" />

由此:

<composite:attribute name="addAction" required="true" 
    method-signature="void addAction(javax.faces.event.ActionEvent)" />

答案 1 :(得分:0)

至少在我的情况下,有些东西需要添加lametaweb的答案,我会在这里解释一下,以防其他人遇到同样的问题:我得到wrong number of arguments例外。问题是actionListener总是传递一个ActionEvent对象作为它正在调用的方法的参数,并且lametaweb修复我的代码的方式我告诉该方法不会传递任何参数。所以我必须在这里解决两件事:在ActionEvent中声明de method-signature参数并明确地将该对象作为我的void方法的接收参数,以便它们匹配发送/接收的参数数量,甚至如果我不打算在我的方法中使用ActionEvent

复合线的最终代码必须是:

<composite:attribute name="addAction" required="true" 
    method-signature="void addAction(javax.faces.event.ActionEvent)" />

我的方法

public void addToListMethod(ActionEvent event) {
   list.add(model); 
}