Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jsf 2 我可以在复合组件中对bean调用方法吗?_Jsf 2_Composite Component - Fatal编程技术网

Jsf 2 我可以在复合组件中对bean调用方法吗?

Jsf 2 我可以在复合组件中对bean调用方法吗?,jsf-2,composite-component,Jsf 2,Composite Component,我想写一个或多或少的gemeric组件,在这里我交上一个控制器bean,该组件应该显示一些CRUD按钮 以下复合构件: <composite:interface> <composite:attribute name="controller" /> <composite:attribute name="object" /> </composite:interface> <composite:implementation>

我想写一个或多或少的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}"/>
单击“取消”按钮时导致以下异常:

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调用方法?

是的,您可以。您的错误只是只传递了一个普通的
字符串
,将托管bean名称表示为属性值

controller="customerController"
实际上,您应该已经从EL范围传递了具体的托管bean实例

controller="#{customerController}"
不可否认,异常消息有些误导,但它基本上只是显示属性值的
对象#toString()
。如果它是一个具体的托管bean实例,您更希望看到如下内容

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

或者由其
toString()
实现返回的任何内容(如果被重写)