我有一个JSF组件,它映射到相应bean中的List上。 由于我希望映射字段在提交表单时至少包含一个值,因此该字段被注释为@NotEmpty。
Bean:
public class MyBean {
@NotEmpty(message="Validation failed")
private List<String> selectedOptions = new ArrayList<>();
... getter & setter
}
每次用户在我的组件上选择一些内容时,我希望选择立即映射到bean中,所以我向组件添加了ajax行为(这里的组件是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>
我的问题发生在以下情况:
dataList
中看到最后一个未选中的值仍在bean中。我对情况的理解是,当用户取消选择最后一个值时,由于字段上的@NotEmpty注释(由p:message
验证失败消息确认),验证失败。因此,不会调用setter,并且最后一个未选中的值仍保留在bean中。
如何以正确的方式允许用户在没有验证失败的情况下取消选择每个项目,并且仅在提交表单时在此字段上运行验证器?