Improve method validation for container elements

This change moves container element properties from ParameterErrors
to base class ParameterValidationResult, and makes that support
independent of whether violations are nested within a container
element bean or through constraints on container elements, e.g.
`List<@NotBlank String>`.

Closes gh-31887
This commit is contained in:
rstoyanchev
2024-01-05 16:32:14 +00:00
parent e0d6b69195
commit 8552e149b5
5 changed files with 172 additions and 114 deletions

View File

@@ -161,7 +161,7 @@ class MethodValidationAdapterTests {
}
@Test
void validateListArgument() {
void validateBeanListArgument() {
MyService target = new MyService();
Method method = getMethod(target, "addPeople");
@@ -195,6 +195,24 @@ class MethodValidationAdapterTests {
});
}
@Test
void validateValueListArgument() {
MyService target = new MyService();
Method method = getMethod(target, "addHobbies");
testArgs(target, method, new Object[] {List.of(" ")}, ex -> {
assertThat(ex.getAllValidationResults()).hasSize(1);
assertValueResult(ex.getValueResults().get(0), 0, " ", List.of("""
org.springframework.context.support.DefaultMessageSourceResolvable: \
codes [NotBlank.myService#addHobbies.hobbies,NotBlank.hobbies,NotBlank.java.util.List,NotBlank]; \
arguments [org.springframework.context.support.DefaultMessageSourceResolvable: \
codes [myService#addHobbies.hobbies,hobbies]; \
arguments []; default message [hobbies]]; default message [must not be blank]"""));
});
}
private void testArgs(Object target, Method method, Object[] args, Consumer<MethodValidationResult> consumer) {
consumer.accept(this.validationAdapter.validateArguments(target, method, null, args, new Class<?>[0]));
}
@@ -250,6 +268,9 @@ class MethodValidationAdapterTests {
public void addPeople(@Valid List<Person> people) {
}
public void addHobbies(List<@NotBlank String> hobbies) {
}
}