diff --git a/impl/src/main/java/jakarta/faces/component/UIViewRoot.java b/impl/src/main/java/jakarta/faces/component/UIViewRoot.java index 721da3ac9e..4a069f2453 100644 --- a/impl/src/main/java/jakarta/faces/component/UIViewRoot.java +++ b/impl/src/main/java/jakarta/faces/component/UIViewRoot.java @@ -1015,17 +1015,23 @@ public void processDecodes(FacesContext context) { * @param context the {@link FacesContext} for the request we are processing. * @param clientIds The client ids to be visited, on which the described action will be taken. */ - public void resetValues(FacesContext context, Collection clientIds) { - visitTree(VisitContext.createVisitContext(context, clientIds, null), new DoResetValues()); + visitTree(VisitContext.createVisitContext(context, clientIds, null), DoResetValues.INSTANCE); } private static class DoResetValues implements VisitCallback { + + private static final DoResetValues INSTANCE = new DoResetValues(); + @Override public VisitResult visit(VisitContext context, UIComponent target) { if (target instanceof EditableValueHolder) { ((EditableValueHolder) target).resetValue(); } + // If render ID didn't specifically point to an EditableValueHolder. Visit all children as well. + else if (!VisitContext.ALL_IDS.equals(context.getIdsToVisit())) { + target.visitTree(VisitContext.createVisitContext(context.getFacesContext(), null, context.getHints()), this); + } return VisitResult.ACCEPT; } }