2012-12-24 52 views
2

我正在JSF2.0中使用bean验证。我有一个验证组,我根据一些条件指定并链接到托管bean中的属性。该属性在页面首次加载并正确工作时(即提交表单时验证了正确的组)时被分配。但是,如果我更改此属性,验证组不会更新,并且将使用原始值设置为。JSF f:validateBean validationGroups not updating

例如: 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中以编程方式更改验证组的方式,但没有任何快乐。

回答

0

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

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

    //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(); 
    

    例如如果您正在执行和渲染部分,您可以拨打 somethig像这样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(); 
        } 
    }