From 7aca8bee69294ca2a70f378cd444f0a04265ec3e Mon Sep 17 00:00:00 2001 From: cuitianhao <54015884+tianhaocui@users.noreply.github.com> Date: Sun, 19 Apr 2026 17:47:54 +0800 Subject: [PATCH] Include cross-parameter violations in hasErrors() and getAllErrors() MethodValidationResult.hasErrors() only checked getParameterValidationResults(), ignoring cross-parameter constraint violations entirely. Similarly, getAllErrors() only collected errors from per-parameter results. When adapt-constraint-violations is enabled, cross-parameter violations are stored separately via getCrossParameterValidationResults(). Both hasErrors() and getAllErrors() now include these results so that cross-parameter constraint violations are properly surfaced. Closes spring-projects/spring-framework#36666 Signed-off-by: cuitianhao <54015884+tianhaocui@users.noreply.github.com> --- .../validation/method/MethodValidationResult.java | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/spring-context/src/main/java/org/springframework/validation/method/MethodValidationResult.java b/spring-context/src/main/java/org/springframework/validation/method/MethodValidationResult.java index d53075bafe3c..8ae36238f71d 100644 --- a/spring-context/src/main/java/org/springframework/validation/method/MethodValidationResult.java +++ b/spring-context/src/main/java/org/springframework/validation/method/MethodValidationResult.java @@ -19,6 +19,7 @@ import java.lang.reflect.Method; import java.util.Collections; import java.util.List; +import java.util.stream.Stream; import org.springframework.context.MessageSourceResolvable; import org.springframework.validation.Errors; @@ -56,17 +57,22 @@ public interface MethodValidationResult { * Whether the result contains any validation errors. */ default boolean hasErrors() { - return !getParameterValidationResults().isEmpty(); + return !getParameterValidationResults().isEmpty() || + !getCrossParameterValidationResults().isEmpty(); } /** - * Return a single list with all errors from all validation results. + * Return a single list with all errors from all validation results, + * including cross-parameter validation errors. * @see #getParameterValidationResults() + * @see #getCrossParameterValidationResults() * @see ParameterValidationResult#getResolvableErrors() */ default List getAllErrors() { - return getParameterValidationResults().stream() - .flatMap(result -> result.getResolvableErrors().stream()) + return Stream.concat( + getParameterValidationResults().stream() + .flatMap(result -> result.getResolvableErrors().stream()), + getCrossParameterValidationResults().stream()) .toList(); }