2

コマンドボタンから直接セッターを呼び出して値を渡したいです。私の問題は、文字列として返す場合、セッターが Character と jsf を期待していることです。バッキングビーンにセッターをオーバーロードする代わりに、フロントエンドでこれを「修正」する良い方法はありますか?

コマンドボタン:

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

バッキング Bean からのゲッター/セッター:

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: data.operation.OperationData@595025a.setBomComplete(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: data.operation.OperationData@595025a.setBomComplete(java.lang.String): javax.faces.event.AbortProcessingException: Method not found: data.operation.OperationData@595025a.setBomComplete(java.lang.String)
4

2 に答える 2

3

残念ながら、これは設計によるものです。引用符で囲まれたものはすべて、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'は自動的にその列挙型に変換されます。おまけとして、列挙型には、コンパイル時の型の安全性など、さらに多くの利点があります。

于 2012-10-22T16:23:37.933 に答える