2013-02-05 48 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() { 
    // ... 
}