从复合组件调用 void 方法
Calling a void method from a composite component
我正在尝试构建复合 JSF 组件,但在调用方法时遇到了一些问题。我的组件在 a 中有一些输入,并且有一个添加按钮负责添加更多对象来执行提供重复的列表。我希望该按钮根据负责它负责的页面的托管 Bean 调用不同的方法(因此它应该是每个 xhtml 中设置的变量)。但是每次我按下按钮,我都会收到异常消息:
The class 'com.test.TestMB' does not have the property '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 class 不仅包含该方法,而且如果我将按钮更改为:
也可以正常工作
<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
中声明 de ActionEvent
参数并明确将该对象作为我的 void 方法的接收参数,以便它们匹配参数数量 sent/recieved ,即使我不打算在我的方法中使用 ActionEvent
。
复合线的最终代码必须是:
<composite:attribute name="addAction" required="true"
method-signature="void addAction(javax.faces.event.ActionEvent)" />
还有我的方法
public void addToListMethod(ActionEvent event) {
list.add(model);
}
我正在尝试构建复合 JSF 组件,但在调用方法时遇到了一些问题。我的组件在 a 中有一些输入,并且有一个添加按钮负责添加更多对象来执行提供重复的列表。我希望该按钮根据负责它负责的页面的托管 Bean 调用不同的方法(因此它应该是每个 xhtml 中设置的变量)。但是每次我按下按钮,我都会收到异常消息:
The class 'com.test.TestMB' does not have the property '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 class 不仅包含该方法,而且如果我将按钮更改为:
也可以正常工作<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
中声明 de ActionEvent
参数并明确将该对象作为我的 void 方法的接收参数,以便它们匹配参数数量 sent/recieved ,即使我不打算在我的方法中使用 ActionEvent
。
复合线的最终代码必须是:
<composite:attribute name="addAction" required="true"
method-signature="void addAction(javax.faces.event.ActionEvent)" />
还有我的方法
public void addToListMethod(ActionEvent event) {
list.add(model);
}