【发布时间】:2012-01-30 00:07:36
【问题描述】:
我正在开发一种用于在数据库中搜索客户的表单。这种形式实际上分为两种形式:比如说简单搜索和高级搜索。
我可以通过单击相应的单选按钮来选择进行高级搜索。当我单击单选按钮时,我的支持 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;
...
}
所以我有一个 name 属性,我希望它是简单搜索所必需的。另一方面,我希望 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 中放置一个 disabled 属性,该属性是根据我的 SearchContextBean 的状态设置的,因为我无法为某些人重新呈现表单原因(我需要根据 EL #{name.valid} 隐藏/显示错误消息容器,如果发生错误,即使在重新渲染之后也会保持 true)。
我希望有一个更简洁的解决方案来验证一个或另一个组。
提前感谢您的帮助。
【问题讨论】: