【问题标题】:Validating different Validation Groups JSF 2.0验证不同的验证组 JSF 2.0
【发布时间】: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)。

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

提前感谢您的帮助。

【问题讨论】:

    标签: java hibernate jsf-2


    【解决方案1】:

    我从未使用过组验证。但是,对我来说,如果我将简单搜索和高级搜索分成两种不同的形式,代码会更清晰,如下所示:

    <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美分!希望对你有帮助:)。

    【讨论】:

    • 谢谢J4mes先生。这显然是我的问题的解决方案,这是我将要使用的解决方案,除了我必须保留单选按钮(这不是我的决定)。无论如何,为了让它工作,我仍然需要将隐藏的 commandButton 放入每个表单中,并为我的搜索按钮创建一个onclick,它将触发其中一个。但是我仍然对 JSF2 跨字段验证感到不满意,我很乐意在这个框架中使用不仅仅是简单的 Hibernate 验证。
    • @Ugo:我刚刚编辑了我的答案。你可以像这样放置2个commandButton。一次只会显示其中一个。
    • 是的,但我必须坚持我的 onclick 技巧,因为我在表单下方有一个完整的按钮栏,为了便于维护,我无法复制。
    • @Ugo: :) 好的。只有你自己才能知道什么是最适合你的。那么祝你好运:P
    猜你喜欢
    • 2012-02-23
    • 2011-04-16
    • 2012-06-08
    • 2011-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-01
    • 1970-01-01
    相关资源
    最近更新 更多