MethodExpression IllegalArgumentException:参数个数错误

时间:2013-02-05 19:20:41

标签: jsf-2

我有一个动态呈现的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)

我得到一个MethodNotFoundException,它找不到“... DynamicComponentTest@1db3b45.addBtn1_action(javax.faces.event.ActionEvent)”

有没有人成功地解决了这个问题?我已尝试将null和String.class作为createMethodExpression中返回值的类型,但这无助于解决它。

1 个答案:

答案 0 :(得分:1)

动作方法不应该有参数。 ActionEvent参数适用于actionListeners。因此,删除该参数,并根据该更改createMethodExpression调用。此外,您的操作方法的返回类型为StringcreateMethodExpression的第三个参数是返回类型。您应该String.class代替null。最后:

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

动作方法签名:

public String addBtn1_action() {
    // ...
}