验证后,jsf无法重置值

时间:2012-07-11 08:40:09

标签: jsf primefaces java-ee-6

我有一个由两个p:calendar组件实现的jsf复合组件。 想法是当选择第一个日历时,需要重置第二个日历的值。验证发生时出现问题,并且未执行第二个日历的重置。

阅读帖子后,我决定在验证器中使用EditableValueHolder。 我有自定义验证器:我在其中添加了以下代码:

@Override

public void validate(FacesContext fc, UIComponent uic, Object o) throws ValidatorException {
//....
resetValues(fc);
}

public void resetValues(FacesContext fc) {
    PartialViewContext partialViewContext = fc.getPartialViewContext();
    Collection<String> renderIds = partialViewContext.getRenderIds();
    UIComponent input;
    UIViewRoot viewRoot = fc.getViewRoot();
    for (String renderId : renderIds) {
        input = viewRoot.findComponent(renderId);
        if (input.isRendered() && input instanceof EditableValueHolder) {
            EditableValueHolder editableValueHolder = (EditableValueHolder) input;
            editableValueHolder.setSubmittedValue(null);
            editableValueHolder.setValue(null);
            editableValueHolder.setValid(true);
            editableValueHolder.setLocalValueSet(false);
        }
    }
}

调试后我可以看到每个代码行都被传递,但是在jsf端没有发生任何事情。

1 个答案:

答案 0 :(得分:4)

现在不是重置值的合适时机。无论如何,在validate()方法离开后,它们将被覆盖当前组件,并且一旦获得验证,它们也将被覆盖。您需要在更新模型值阶段之后的某处执行重置,最好在调用操作阶段之前执行重置,以便您有机会在操作(侦听器)方法中更改模型值。您可以使用ActionListenerPhaseListener

顺便说一句,JSF实用程序库OmniFaces有一个可重用的解决方案,适用于ResetInputAjaxActionListener