From ebb3ac69fae7edc30add6a8e82c6878e6a12fadf Mon Sep 17 00:00:00 2001 From: Babur Date: Wed, 21 Jun 2023 10:16:26 +0200 Subject: [PATCH] Support bean validation with ArgumentValue wrapper See gh-737 --- .../support/ArgumentValueExtractor.java | 17 +++++++++++++++++ ...ta.validation.valueextraction.ValueExtractor | 1 + .../support/ValidationHelperTests.java | 9 +++++++++ 3 files changed, 27 insertions(+) create mode 100644 spring-graphql/src/main/java/org/springframework/graphql/data/method/annotation/support/ArgumentValueExtractor.java create mode 100644 spring-graphql/src/main/resources/META-INF/services/jakarta.validation.valueextraction.ValueExtractor diff --git a/spring-graphql/src/main/java/org/springframework/graphql/data/method/annotation/support/ArgumentValueExtractor.java b/spring-graphql/src/main/java/org/springframework/graphql/data/method/annotation/support/ArgumentValueExtractor.java new file mode 100644 index 00000000..beb4ced7 --- /dev/null +++ b/spring-graphql/src/main/java/org/springframework/graphql/data/method/annotation/support/ArgumentValueExtractor.java @@ -0,0 +1,17 @@ +package org.springframework.graphql.data.method.annotation.support; + +import jakarta.validation.valueextraction.ExtractedValue; +import jakarta.validation.valueextraction.UnwrapByDefault; +import jakarta.validation.valueextraction.ValueExtractor; +import org.springframework.graphql.data.ArgumentValue; + +@UnwrapByDefault +public class ArgumentValueExtractor implements ValueExtractor> { + + @Override + public void extractValues(ArgumentValue originalValue, ValueReceiver receiver) { + if (originalValue.isPresent()) { + receiver.value(null, originalValue.value()); + } + } +} diff --git a/spring-graphql/src/main/resources/META-INF/services/jakarta.validation.valueextraction.ValueExtractor b/spring-graphql/src/main/resources/META-INF/services/jakarta.validation.valueextraction.ValueExtractor new file mode 100644 index 00000000..df4cce12 --- /dev/null +++ b/spring-graphql/src/main/resources/META-INF/services/jakarta.validation.valueextraction.ValueExtractor @@ -0,0 +1 @@ +org.springframework.graphql.data.method.annotation.support.ArgumentValueExtractor \ No newline at end of file diff --git a/spring-graphql/src/test/java/org/springframework/graphql/data/method/annotation/support/ValidationHelperTests.java b/spring-graphql/src/test/java/org/springframework/graphql/data/method/annotation/support/ValidationHelperTests.java index d8fcde93..78116531 100644 --- a/spring-graphql/src/test/java/org/springframework/graphql/data/method/annotation/support/ValidationHelperTests.java +++ b/spring-graphql/src/test/java/org/springframework/graphql/data/method/annotation/support/ValidationHelperTests.java @@ -27,6 +27,7 @@ import jakarta.validation.ConstraintViolationException; import jakarta.validation.Valid; import jakarta.validation.Validation; import jakarta.validation.constraints.Max; +import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; import org.assertj.core.api.InstanceOfAssertFactories; import org.assertj.core.api.IterableAssert; @@ -34,6 +35,7 @@ import org.assertj.core.api.ThrowableAssert; import org.junit.jupiter.api.Test; import org.springframework.beans.BeanUtils; +import org.springframework.graphql.data.ArgumentValue; import org.springframework.graphql.data.method.HandlerMethod; import org.springframework.validation.annotation.Validated; @@ -68,6 +70,9 @@ class ValidationHelperTests { BiConsumer validator2 = createValidator(MyBean.class, "myValidatedParameterMethod"); assertViolation(() -> validator2.accept(bean, new Object[] {new ConstrainedInput(100)}), "integerValue"); + + BiConsumer validator3 = createValidator(MyBean.class, "myValidArgumentValue"); + assertViolation(() -> validator3.accept(bean, new Object[] {ArgumentValue.ofNullable("")}), "myValidArgumentValue.arg0"); } @Test @@ -154,6 +159,10 @@ class ValidationHelperTests { public Object myValidatedParameterMethod(@Validated ConstrainedInput input) { return null; } + + public Object myValidArgumentValue(@Valid ArgumentValue<@NotBlank String> arg0) { + return null; + } }