我正在使用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中以编程方式更改验证组,但没有任何乐趣。
答案 0 :(得分: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();
e.g。如果你正在执行并渲染一个部分,你可以打电话 像actionListner中的somethig:
public void resetContactsValidationGroups() {
FacesContext ctx = FacesContext.getCurrentInstance();
Iterator<String> ids = ctx.getPartialViewContext().getExecuteIds().iterator();
while (ids.hasNext()) {
ctx.getViewRoot().findComponent(ids.next()).getChildren().clear();
}
}