我使用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中以编程方式更改验证组的方法,但没有找到满意的方法。
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();
。如果您正在执行和呈现一个节,则可以调用像这样在actionlistener:
public void resetContactsValidationGroups() { FacesContext ctx = FacesContext.getCurrentInstance(); Iterator<String> ids = ctx.getPartialViewContext().getExecuteIds().iterator(); while (ids.hasNext()) { ctx.getViewRoot().findComponent(ids.next()).getChildren().clear(); } }