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