1

ビジネス エンティティの「ステータス」コントロールとして selectOneMenu を使用しようとしています。ドロップダウンにはステータスのリストがあります。ユーザーがステータスを選択すると、一連の複雑なビジネス ルールが実行され、選択されたステータスがビジネス エンティティに設定できるかどうかが判断されます。そうでない場合は、理由を示すメッセージを書き出し、ステータスの設定を禁止します。これはすべて、検証が失敗する前にドロップダウンを以前のステータス (現在のステータス) にリセットしたいことを除いて、JSF ライフサイクル内でうまく機能します。したがって、ステータス A からステータス B に切り替えても失敗した場合は、フォーム コントロールをステータス B にリセットしたいと考えています。

facelet コード

<p:selectOneMenu id="statusMenu"
    binding="#{mybean.statusMenu}"
    converter="myConverter"
    value="#{mybean.statusValue}">

    <f:event type="preValidate" listener="#{mybean.validateStatus}"/>
    <p:ajax update="statusMenu :someForm :someOtherForm" />

    <f:selectItems value="#{mybean.statusList}"
        var="status"
        itemLabel="#{status.statusText}"
        itemValue="#{status}">
    </f:selectItems>
</p:selectOneMenu>

バッキング Bean の検証メニュー

public void validateStatus (ComponentSystemEvent e)
{
    String submittedStatus = ((MyStatus)getStatusMenu().getValue()).getStatusText();

    if(submittedStatus.equals("someStatus"))
    {       
        //do validation
        boolean valid = doBusinessStatusValidationLogicStuff()

        if(!valid)
        {
            //a combination of junk that attempts to reset the form value, or do *something* to it
            getStatusMenu().resetValue();
            getStatusMenu().setSubmittedValue(null);
            getStatusMenu().setValue(null);
            getStatusMenu().setLocalValueSet(false);

            FacesMessage errorMessage = new FacesMessage(severity, summary, detail);
            context.addMessage(null, "you fail");
            context.isValidationFailed();
            context.renderResponse();
        }
    }
}

バインドされたコンポーネントの値が目的の値に設定されていることをデバッガーで確認できますが、フォーム コントロールは更新されません。私は何が欠けていますか?

4

1 に答える 1

0

等号/ハッシュコードの問題になりました。ということで、いつもそこをチェック!

于 2012-06-04T21:20:51.153 に答える