Unwrap Optional in MethodValidationAdapter

See gh-31746
This commit is contained in:
rstoyanchev
2023-12-21 17:55:49 +00:00
parent f0add920f5
commit 459338f6fd
2 changed files with 24 additions and 1 deletions

View File

@@ -24,6 +24,7 @@ import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.function.Function;
import java.util.function.Supplier;
@@ -354,6 +355,10 @@ public class MethodValidationAdapter implements MethodValidator {
bean = map.get(containerKey);
container = map;
}
else if (arg instanceof Optional<?> optional) {
bean = optional.orElse(null);
container = optional;
}
else {
Assert.state(!node.isInIterable(), "No way to unwrap Iterable without index");
bean = arg;

View File

@@ -20,6 +20,7 @@ import java.lang.reflect.Method;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotBlank;
@@ -146,6 +147,20 @@ public class MethodValidationAdapterPropertyPathTests {
assertSingleFieldError(errors, 1, courses, null, "CS 101", "professor.name", invalidPerson.name());
}
@Test
void fieldOfObjectPropertyOfOptionalBean() {
Method method = getMethod("addOptionalCourse");
Optional<Course> optional = Optional.of(new Course("CS 101", invalidPerson, Collections.emptyList()));
Object[] args = {optional};
MethodValidationResult result =
validationAdapter.validateArguments(new MyService(), method, null, args, HINTS);
assertThat(result.getAllErrors()).hasSize(1);
ParameterErrors errors = result.getBeanResults().get(0);
assertSingleFieldError(errors, 1, optional, null, null, "professor.name", invalidPerson.name());
}
}
@@ -204,7 +219,7 @@ public class MethodValidationAdapterPropertyPathTests {
}
@SuppressWarnings("unused")
@SuppressWarnings({"unused", "OptionalUsedAsFieldOrParameterType"})
private static class MyService {
public void addCourse(@Valid Course course) {
@@ -219,6 +234,9 @@ public class MethodValidationAdapterPropertyPathTests {
public void addCourseMap(@Valid Map<String, Course> courses) {
}
public void addOptionalCourse(@Valid Optional<Course> course) {
}
@Valid
public Course getCourse(Course course) {
throw new UnsupportedOperationException();