ビジネス エンティティの「ステータス」コントロールとして 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();
}
}
}
バインドされたコンポーネントの値が目的の値に設定されていることをデバッガーで確認できますが、フォーム コントロールは更新されません。私は何が欠けていますか?