1

動的にレンダリングされるJSFページがあります。すべてのコンポーネントはバッキングBeanによって作成され、グリッドに追加されます。ボタンがクリックされたときに呼び出すメソッドを設定するためのMethodExpressionを作成したコマンドボタンがあります。ただし、ボタンをクリックすると、「java.lang.IllegalArgumentException:引数の数が正しくありません」および「javax.faces.FacesException:引数の数が正しくありません」という例外が発生します。

ボタンを作成するコードは

HtmlCommandButton addBtn1 = (HtmlCommandButton) FacesContext.getCurrentInstance().
getApplication().createComponent(HtmlCommandButton.COMPONENT_TYPE);
addBtn1.setId("addBtn1");
addBtn1.setValue("Add Row");
String addBtn1Action = "#{dynamicComponentTest.addBtn1_action}";
Class[] args = new Class[]{ActionEvent.class};
MethodExpression addBtn1ME = FacesContext.getCurrentInstance().getApplication().
getExpressionFactory().createMethodExpression(
FacesContext.getCurrentInstance().getELContext(), addBtn1Action, null, args);
addBtn1.setActionExpression(addBtn1ME);
mainGrid.getChildren().add(addBtn1);

次に、アクションメソッドのシグネチャは次のようになります。

public String addBtn1_action(ActionEvent event)

テストアプリを実行してボタンをクリックすると、例外が発生します。ただし、署名をに変更すると

public String addBtn1_action(ActionEvent[] event)

「...DynamicComponentTest@1db3b45.addBtn1_action(javax.faces.event.ActionEvent)」が見つからないMethodNotFoundExceptionが発生します

誰かがこの問題をうまく解決しましたか?createMethodExpressionの戻り値の型としてnullとString.classの両方を試しましたが、それは解決に役立ちません。

4

1 に答える 1

1

アクションメソッドにパラメータを含めることはできません。ActionEventパラメータは用actionListenersです。したがって、そのパラメータを削除し、createMethodExpressionそれに応じて呼び出しを変更します。また、アクションメソッドの戻り値のタイプはですString。の3番目のパラメータcreateMethodExpressionはリターンタイプです。String.classの代わりに配置する必要がありnullます。ついに:

FacesContext.getCurrentInstance().getApplication().getExpressionFactory().
        createMethodExpression(
        FacesContext.getCurrentInstance().getELContext(),
          addBtn1Action, String.class, new Class[0]);

そして、アクションメソッドのシグネチャ:

public String addBtn1_action() {
    // ...
}
于 2013-02-05T20:39:04.443 に答える