2013-02-05 50 views
1

我有一个动态呈现的JSF页面 - 所有组件都由支持bean创建并添加到网格中。我有一个命令按钮,我创建了一个MethodExpression来设置单击该按钮时要调用的方法。但单击此按钮会导致异常“java.lang.IllegalArgumentException:参数数量错误”和“javax.faces.FacesException:参数数量错误”。MethodExpression IllegalArgumentException:参数数量错误

创建按钮上的代码是

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它找不到“...... [email protected]_action(javax.faces.event.ActionEvent)”

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

回答

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() { 
    // ... 
}