【问题标题】:Calling a void method from a composite component从复合组件调用 void 方法
【发布时间】:2015-12-20 00:51:34
【问题描述】:

我正在尝试构建一个复合 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); }

关于什么是错误的任何想法以及如何解决它?

【问题讨论】:

  • 你试过我的答案了吗?如果它解决了您的问题,请接受它。要将答案标记为已接受,请单击答案旁边的复选标记以将其从空心切换为绿色。
  • 很抱歉花了这么长时间才看到你的答案...我刚刚尝试过,但它没有用:我收到 java.lang.IllegalArgumentException:错误数量的参数...任何为什么?

标签: jsf actionlistener composite-component commandbutton methodexpression


【解决方案1】:

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

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

通过这个:

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

【讨论】:

  • 我收到 java.lang.IllegalArgumentException: 参数数量错误... :(
  • 哦,我刚刚得到了解决方案!我将发布一个新的回复来解释我自己的问题!
【解决方案2】:

至少在我的情况下,需要添加 lametaweb 的答案,如果其他人有同样的问题,我会在这里解释一下:我收到了 wrong number of arguments 异常。问题是 actionListener 总是将 ActionEvent 对象作为参数传递给它正在调用的方法,而 lametaweb 修复我的代码的方式我告诉我该方法不会传递任何参数。所以我必须在这里解决两件事:在 method-signature 中声明 de 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); 
}

【讨论】:

  • 我回答的太仓促了。我已经用正确的答案对其进行了编辑。谢谢。
  • BalusC,感谢您的阅读:我正在阅读有关它的内容,但我仍然不确定在每种情况下应该使用哪个(对于 commandButton 和 button 之间的区别也是如此)
  • lametaweb,别担心:你的答案是正确的,让我得到了答案(并迫使我学习更多......作为一个初学者,这对我来说至关重要! ;-) )
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-25
  • 1970-01-01
  • 2010-11-16
  • 2011-12-14
  • 1970-01-01
相关资源
最近更新 更多