3

我想编写一个或多或少的 gemeric 组件,我在其中提交一个控制器 bean,并且组件应该显示一些 CRUD 按钮。

以下复合组件:

<composite:interface>
  <composite:attribute name="controller" />
  <composite:attribute name="object" />
</composite:interface>

<composite:implementation>

  <h:panelGrid columns="3" columnClasses="celltop">
    <h:commandButton id="save" value="#{msg.saveButtonLabel}"
      action="#{cc.attrs.controller.save}" />
    <h:commandButton id="delete" value="#{msg.deleteButtonLabel}"
      action="#{cc.attrs.controller.delete(cc.attrs.object)}" />
    <h:commandButton id="cancel" value="#{msg.backButtonLabel}"
      action="#{cc.attrs.controller.cancel}" immediate="true" />
  </h:panelGrid>

</composite:implementation>

<viewController:buttons controller="customerController" object="#{customerController.customer}"/>
@Named
@ConversationScoped
public class CustomerController implements Serializable {

    public String cancel() {
    customer = null;
    if (!conversation.isTransient()) {
        conversation.end();
    }
    return "cancelled";
}

当我单击取消按钮时导致以下异常:

javax.faces.el.MethodNotFoundException: javax.el.MethodNotFoundException: /resources/components/viewController/buttons.xhtml @25,65 action="#{cc.attrs.controller.cancel}": Method not found: customerController.cancel()
    at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:92)

不能在给 CC 的 bean 上调用方法吗?

4

1 回答 1

3

是的你可以。您的错误只是您仅传递了一个普通的香草String,表示托管 bean 名称作为属性值

controller="customerController"

而您实际上应该已经从 EL 范围传递了具体的托管 bean 实例

controller="#{customerController}"

诚然,异常消息有些误导,但它基本上只是显示Object#toString()属性值。如果它是一个具体的托管 bean 实例,你宁愿看到类似的东西

找不到方法:com.example.CustomerController@12345678.cancel()

或由其toString()实现返回的任何内容(如果被覆盖)。

于 2012-08-16T20:13:34.050 回答