我正在处理一个用于在数据库中搜索客户端的表单。此表单实际上以两种形式分隔:假设简单搜索和高级搜索。
我可以通过点击相应的单选按钮选择进行高级搜索。当我单击单选按钮时,我的支持bean的状态从SimpleSearchState变为AdvancedSearchState(State Pattern)。
以下是我的表单的支持bean:
public class SearchContextBean {
/**
* Injected beans
*/
@ManagedProperty(value = "#{simpleSearchStateBean}")
private SimpleSearchStateBean simpleSearchStateBean;
@ManagedProperty(value = "#{advancedSearchStateBean}")
private AdvancedSearchStateBean advancedSearchStateBean;
/**
* State
*/
private SearchState searchState = simpleSearchStateBean;
/**
* Properties, validations.
*/
@NotEmpty(groups={SimpleSearchValidationGroup.class})
private String name;
@Size(max=18, groups={AdvancedSearchValidationGroup.class})
private String firstName;
...
}
所以我有一个名称属性,我希望它对于简单搜索是强制性的。另一方面,我希望仅对高级搜索验证 firstName 属性的大小。
这是我的.xhtml页面的一部分:
<h:inputText name="name" id="name"
value="#{cc.attrs.searchContextBean.name}">
<f:validateBean
validationGroups="package.to.my.SimpleSearchValidationGroup" />
</h:inputText>
<h:inputText name="firstName" id="firstName"
value="#{cc.attrs.searchContextBean.firstName}">
<f:validateBean
validationGroups="package.to.my.AdvancedSearchValidationGroup" />
</h:inputText>
我试图实现Hibernate's GroupSequenceProvider但没有成功:覆盖方法getValidationGroups
总是收到null而不是我的bean对象。然后即使我通过返回不同的验证组类列表来更改组序列,它也没有改变我的网页验证中的任何内容。
问题是,我无法在我的 f:validateBean 中添加一个已禁用属性,该属性是根据我的SearchContextBean的状态设置的,因为我无法为某些形式重新呈现该表单原因(我需要根据EL#{name.valid}隐藏/显示错误消息容器,如果发生错误,即使在重新渲染后仍保持 true 。
我希望有一个更清晰的解决方案来验证一个或另一个组。
感谢提前帮助。
答案 0 :(得分:2)
我从未使用过群组验证。但是,对我来说,如果我将简单搜索和放大分开,代码将会更加清晰。高级搜索到2种不同的形式:
<h:selectBooleanCheckbox id="isSimple" value="#{searchBean.simple}">
<f:ajax render="searchPanel" />
</h:selectBooleanCheckbox>
<h:panelGroup id="searchPanel">
<h:form rendered="#{searchBean.simple}" id="simpleSearch>
<h:inputText id="name" value="#{simpleSearchBean.name}" />
<h:inputText id="age" value="#{simpleSearchBean.age}" />
<h:commandButton id="simpleButton" action="#{simpleSearchBean.search}" value="Search" />
</h:form>
<h:form rendered="#{not searchBean.simple}" id="advancedSearch>
<h:inputText id="firstname" value="#{advancedSearchBean.firstName}" />
<h:inputText id="age" value="#{advancedSearchBean.age}" />
<h:commandButton id="advancedButton" action="#{advancedSearchBean.search}" value="Search" />
</h:form>
</h:panelGroup>
@ManagedBean
@ViewScoped
public class SearchBean {
private boolean simple;
}
然后您可以单独执行验证。只需2美分!希望它可以帮助你:)。