対応する Bean のリストにマップされた JSF コンポーネントがあります。フォームが送信されるときにマップされたフィールドに少なくとも 1 つの値が含まれるようにするため、このフィールドには @NotEmpty という注釈が付けられます。
豆 :
public class MyBean {
@NotEmpty(message="Validation failed")
private List<String> selectedOptions = new ArrayList<>();
... getter & setter
}
ユーザーがコンポーネントで何かを選択するたびに、選択内容をすぐに Bean にマップする必要があるため、コンポーネントに ajax 動作を追加します (ここではコンポーネントは a ですp:selectManyMenu
が、List にマップされたコンポーネントには問題があるようです) ) :
XHTML :
<h:form>
<p:outputLabel for="optionslist" value="Options :" />
<p:selectManyMenu id="optionslist" value="#{myBean.selectedOptions}" style="margin-bottom:50px">
<f:selectItem itemLabel="Option 1" itemValue="1" />
<f:selectItem itemLabel="Option 2" itemValue="2" />
<f:selectItem itemLabel="Option 3" itemValue="3" />
<p:ajax process="@this" update="result optionsListMessage" />
</p:selectManyMenu>
<p:commandButton value="Submit" update="result optionsListMessage" />
<p:message for="optionslist" id="optionsListMessage" />
<p:dataList id="result" value="#{myBean.selectedOptions}" var="option">
<h:outputText value="#{option}" />
</p:dataList>
</h:form>
私の問題は、次の状況で発生します。
- ユーザーは 1 つまたは複数の選択肢を選択します (Ctrl + ここをクリック)。
- 選択したすべての選択肢を選択解除します。
- 彼はフォームを送信します。
- 結果を見る
dataList
と、最後に選択されていない値がまだ Bean にあることがわかります。
状況についての私の理解では、ユーザーが最後の値の選択を解除すると、フィールドの @NotEmpty アノテーションが原因で検証が失敗するということです (p:message
検証失敗メッセージで確認されます)。結果として、セッターは呼び出されず、最後に選択されていない値が Bean に残ります。
適切な方法で、ユーザーが検証に失敗することなくすべてのアイテムを選択解除できるようにし、フォームが送信されたときにのみこのフィールドでバリデーターを実行できるようにするにはどうすればよいですか?