From 404c4d9d92ab7821a07ac4490aaf8af573ebe806 Mon Sep 17 00:00:00 2001 From: Brian Clozel Date: Wed, 5 Jun 2024 20:02:46 +0200 Subject: [PATCH] Support @Valid on container elements for handler arguments Prior to this commit, #31870 added support for constraint annotations on container elements for handler method argument validation. Supporting this use case: ``` public void addNames(List<@NotEmpty String> names) ``` This commit does the same for `@Valid` annotation: ``` public void addPeople(List<@Valid Person> people) ``` Fixes gh-32964 --- .../springframework/web/method/HandlerMethod.java | 2 +- .../web/method/HandlerMethodTests.java | 13 +++++++++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/spring-web/src/main/java/org/springframework/web/method/HandlerMethod.java b/spring-web/src/main/java/org/springframework/web/method/HandlerMethod.java index 67202e75df..a7cbd3d878 100644 --- a/spring-web/src/main/java/org/springframework/web/method/HandlerMethod.java +++ b/spring-web/src/main/java/org/springframework/web/method/HandlerMethod.java @@ -417,7 +417,7 @@ public class HandlerMethod extends AnnotatedMethod { return true; } merged = MergedAnnotations.from(getContainerElementAnnotations(param)); - if (merged.stream().anyMatch(CONSTRAINT_PREDICATE)) { + if (merged.stream().anyMatch(CONSTRAINT_PREDICATE.or(VALID_PREDICATE))) { return true; } } diff --git a/spring-web/src/test/java/org/springframework/web/method/HandlerMethodTests.java b/spring-web/src/test/java/org/springframework/web/method/HandlerMethodTests.java index 82e903db1c..678b9587f6 100644 --- a/spring-web/src/test/java/org/springframework/web/method/HandlerMethodTests.java +++ b/spring-web/src/test/java/org/springframework/web/method/HandlerMethodTests.java @@ -40,14 +40,14 @@ class HandlerMethodTests { @Test void shouldValidateArgsWithConstraintsDirectlyOnClass() { Object target = new MyClass(); - testValidateArgs(target, List.of("addIntValue", "addPersonAndIntValue", "addPersons", "addNames"), true); + testValidateArgs(target, List.of("addIntValue", "addPersonAndIntValue", "addPersons", "addPeople", "addNames"), true); testValidateArgs(target, List.of("addPerson", "getPerson", "getIntValue", "addPersonNotValidated"), false); } @Test void shouldValidateArgsWithConstraintsOnInterface() { Object target = new MyInterfaceImpl(); - testValidateArgs(target, List.of("addIntValue", "addPersonAndIntValue", "addPersons"), true); + testValidateArgs(target, List.of("addIntValue", "addPersonAndIntValue", "addPersons", "addPeople"), true); testValidateArgs(target, List.of("addPerson", "addPersonNotValidated", "getPerson", "getIntValue"), false); } @@ -115,6 +115,9 @@ class HandlerMethodTests { public void addPersons(@Valid List persons) { } + public void addPeople(List<@Valid Person> persons) { + } + public void addNames(List<@NotEmpty String> names) { } @@ -144,6 +147,8 @@ class HandlerMethodTests { void addPersons(@Valid List persons); + void addPeople(List<@Valid Person> persons); + void addPersonNotValidated(Person person); @Valid @@ -173,6 +178,10 @@ class HandlerMethodTests { public void addPersons(List persons) { } + @Override + public void addPeople(List<@Valid Person> persons) { + } + @Override public void addPersonNotValidated(Person person) { }