2012-10-22 88 views
1

我想直接從命令按鈕調用setter並傳遞一個值。我的問題是,如果將字符串作爲字符串傳回,setter將期待一個Character和jsf。有沒有一種很好的方法可以在前端解決這個問題,而不必在我的支持bean上加載setter?在字符中傳遞字符(vs傳遞字符串)到backing bean方法

的commandButton:從後臺bean

<p:commandButton value="SignOff" 
    actionListener="#{manageItemHandler.dataEntryOp.setBomComplete('Y')}" 
    rendered="#{speed2Session.isRendered('editManageItemOp')}"/> 

的getter/setter:

protected Character bomComplete; 

/** 
* @return the bomComplete 
*/ 
public Character getBomComplete() { 
    return bomComplete; 
} 
/** 
* @param bomComplete the bomComplete to set 
*/ 
public void setBomComplete(Character bomComplete) { 
    this.bomComplete = bomComplete; 
} 

當我單擊命令我得到

11:47:19,270 SEVERE [javax.enterprise.resource.webcontainer.jsf.context] (http-steves-172.16.8.26-15081-1) JSF1073: javax.faces.event.AbortProcessingException caught during processing of INVOKE_APPLICATION 5 : UIComponent-ClientId=centerForm:j_idt271, Message=Method not found: [email protected](java.lang.String) 
11:47:19,273 SEVERE [javax.enterprise.resource.webcontainer.jsf.context] (http-steves-172.16.8.26-15081-1) Method not found: [email protected](java.lang.String): javax.faces.event.AbortProcessingException: Method not found: [email protected](java.lang.String) 

回答

2

這不幸的是,通過設計。引號中的所有內容在EL中都被視爲String。解決方法是改爲通過String#charAt()

#{manageItemHandler.dataEntryOp.setBomComplete('Y'.charAt(0))} 

這只是醜陋的。另一種方法是通過int代碼點,即89代替Y

#{manageItemHandler.dataEntryOp.setBomComplete(89)} 

但這不完全是自我記錄。更好的是隻使用枚舉。

public enum Choice { 
    Y, N; 
} 

protected Choice bomComplete; 

,你可以只調用所需的方式

#{manageItemHandler.dataEntryOp.setBomComplete('Y')} 

字符串'Y'將被自動轉換爲枚舉。作爲獎勵,枚舉還有更多額外的優點,例如編譯時類型安全。

+0

謝謝你(一如既往)的行爲的徹底解釋和給出多種可能的解決方案。 – SteveS

+0

不客氣。 – BalusC