我有一个动态呈现的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作为返回值的类型,但这并不能帮助解决这个问题。
发布于 2013-02-06 04:39:04
操作方法不应具有参数。ActionEvent参数是针对actionListeners的。因此,删除该参数,并根据该参数更改createMethodExpression调用。另外,动作方法的返回类型是String。createMethodExpression的第三个参数是返回类型。你应该用String.class代替null。最后:
FacesContext.getCurrentInstance().getApplication().getExpressionFactory().
createMethodExpression(
FacesContext.getCurrentInstance().getELContext(),
addBtn1Action, String.class, new Class[0]);和action方法签名:
public String addBtn1_action() {
// ...
}https://stackoverflow.com/questions/14715225
复制相似问题