JSF f:validateBean validationGroups не обновляется

Я использую проверку бина с JSF2.0. У меня есть группа проверки, которую я указываю в зависимости от нескольких условий и ссылки на атрибут в управляемом компоненте. Атрибут назначается при первой загрузке страницы и работает правильно (т. Е. При отправке формы проверяются правильные группы). Однако, если я изменю это свойство, группы проверки не будут обновлены, и будет использовано исходное значение.

например: фрагмент 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
}

Любые идеи о том, как заставить это работать? Я также искал способ программного изменения групп проверки в управляемом компоненте, но без радости.

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);
        }
    }
    
  • Или вы можете использовать подход, описанный в этой статье: удалить компоненты, содержащие нежелательное состояние

    Идея состоит в том, чтобы удалить компоненты с 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();
       }
    }
    
Другие вопросы по тегам