验证不同的验证组JSF 2.0

时间:2011-12-29 16:04:40

标签: java hibernate jsf-2

我正在处理一个用于在数据库中搜索客户端的表单。此表单实际上以两种形式分隔:假设简单搜索高级搜索

我可以通过点击相应的单选按钮选择进行高级搜索。当我单击单选按钮时,我的支持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

我希望有一个更清晰的解决方案来验证一个或另一个组。

感谢提前帮助。

1 个答案:

答案 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美分!希望它可以帮助你:)。