動的にレンダリングされる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の両方を試しましたが、それは解決に役立ちません。