【问题标题】:JSF f:validateBean validationGroups not updatingJSF f:validateBean 验证组未更新
【发布时间】:2012-12-24 15:29:58
【问题描述】:

我正在使用带有 JSF2.0 的 bean 验证。我有一个验证组,我根据几个条件指定它并链接到托管 bean 中的属性。该属性是在页面首次加载并正常工作时分配的(即,当提交表单时,验证了正确的组)。但是,如果我更改此属性,则验证组不会更新,并且将使用设置的任何原始值。

例如: JSF 片段:

<h:selectOneMenu id="unitOfMerchandise" value="#itemManager[targetBean].unitOfMerchandise}">
    <f:selectItem itemLabel="-- select --" itemValue="" />
    <f:selectItems value="#{itemManager.unitsOfMerchandise}" />
    <f:validateBean   validationGroups="#{itemManager.validatorClass}"  />
 </h:selectOneMenu>

方法:

@ManagedBean
@ViewScoped
public class ItemManager implements Serializable {
private String validatorClass = "com.rcs.itemmngr.model.validation.RegularItem"
private OpenItemRequest openItemRequest


private void onItemTypeSelected() {

        validatorClass = itemManagerModel.getValidatorItemRequestClass(openItemRequest).getName();

}
///getters setters
}

关于如何让它发挥作用的任何想法?我还寻找了一种在托管 bean 中以编程方式更改验证组的方法,但没有任何乐趣。

【问题讨论】:

    标签: jsf jsf-2 validationgroup


    【解决方案1】:

    f:validateBean 组被评估一次:在构建组件树时。似乎没有简单的方法来更新它们。

    • 您可以为每个组件手动更新它们:

      //bind you component here
      EditableValueHolder input;    
      
      //call this to update groups         
      public void setValidationGroups(String validationGroups) {
          for (Validator validator : input.getValidators()) {
              if (!(validator instanceof BeanValidator)) {
                   continue;
              }
              BeanValidator beanValidator = (BeanValidator) validator;
              beanValidator.setValidationGroups(validationGroups);
          }
      }
      
    • 或者您可以使用本文中描述的方法: Delete the components holding unwanted state

      这个想法是从树中删除带有 f:validateBean 的组件,所以 它们将在使用新组进行渲染时重新初始化:

      parentComponent.getChildren().clear();
      

      例如如果你正在执行和渲染一个部分,你可以调用 actionListner 中的类似内容:

      public void resetContactsValidationGroups() {
         FacesContext ctx = FacesContext.getCurrentInstance();
         Iterator<String> ids = ctx.getPartialViewContext().getExecuteIds().iterator();
         while (ids.hasNext()) {
             ctx.getViewRoot().findComponent(ids.next()).getChildren().clear();
         }
      }
      

    【讨论】:

      猜你喜欢
      • 2015-12-10
      • 1970-01-01
      • 1970-01-01
      • 2015-02-13
      • 2012-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多