2

我正在尝试构建一个复合 JSF 组件,但在调用方法时遇到了一些麻烦。我的组件在 a 中有一些输入,并且一个添加按钮负责添加更多对象,用于提供重复的列表。我希望该按钮根据负责它所负责的页面的托管 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); }

关于什么是错误的任何想法,我该如何解决?

4

2 回答 2

4

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

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

这样:

<composite:attribute name="addAction" required="true" 
    method-signature="void addAction(javax.faces.event.ActionEvent)" />
于 2015-09-22T22:24:39.080 回答
0

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

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

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

还有我的方法

public void addToListMethod(ActionEvent event) {
   list.add(model); 
}
于 2015-09-23T14:01:17.253 回答