验证后,jsf无法重置值

验证后,jsf无法重置值,jsf,primefaces,java-ee-6,Jsf,Primefaces,Java Ee 6,我有一个jsf复合组件,它是由两个p:calendar组件实现的。 其想法是,当选择第一个日历时,需要重置第二个日历的值。进行验证时出现问题,并且未执行第二个日历的重置 在阅读了文章之后,我决定在我的验证器中使用EditableValueHolder。 我有一个自定义验证器:我在其中添加了以下代码: @Override public void validate(FacesContext fc, UIComponent uic, Object o) throws ValidatorExcepti

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

在阅读了文章之后,我决定在我的验证器中使用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);
        }
    }
}
@覆盖
公共无效验证(FacesContext fc、uic组件uic、对象o)引发验证异常{
//....
重置值(fc);
}
公共无效重置值(FacesContext fc){
PartialViewContext PartialViewContext=fc.getPartialViewContext();
集合renderIds=partialViewContext.getRenderIds();
组件输入;
UIViewRoot viewRoot=fc.getViewRoot();
用于(字符串renderId:renderIds){
输入=viewRoot.findComponent(renderId);
if(input.isRendered()&&input instanceof EditableValueHolder){
EditableValueHolder EditableValueHolder=(EditableValueHolder)输入;
editableValueHolder.setSubmittedValue(空);
editableValueHolder.setValue(空);
editableValueHolder.setValid(true);
editableValueHolder.setLocalValueSet(false);
}
}
}

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

现在不是重置值的时候。在
validate()
方法离开后,对于当前组件,以及第二个日历,它们将被覆盖,一旦它得到验证。您需要在更新模型值阶段之后的某个地方执行重置,最好是在调用操作阶段之前,以便有机会在操作(侦听器)方法中更改模型值。您可以使用
ActionListener
PhaseListener
进行此操作


顺便说一下,JSF实用程序库为此提供了一个可重用的解决方案。

现在不是重置值的时候。在
validate()
方法离开后,对于当前组件,以及第二个日历,它们将被覆盖,一旦它得到验证。您需要在更新模型值阶段之后的某个地方执行重置,最好是在调用操作阶段之前,以便有机会在操作(侦听器)方法中更改模型值。您可以使用
ActionListener
PhaseListener
进行此操作

顺便说一下,JSF实用程序库为此提供了一个可重用的解决方案