3

コントローラー 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 に答える