2

我正在使用带有 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 中以编程方式更改验证组的方法,但没有任何乐趣。

4

1 回答 1

0

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);
        }
    }
    
  • 或者您可以使用本文中描述的方法: 删除持有不需要状态的组件

    这个想法是从树中删除带有 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-05-27T12:25:52.353 回答