From 966276c01b22a3cac9c8ae00729557c14420477f Mon Sep 17 00:00:00 2001 From: Koen Punt Date: Mon, 23 Oct 2023 19:24:31 +0200 Subject: [PATCH] Allow null arguments in ValueExtractor `isPresent()` returns false, even when an explicit `null` value is supplied. By checking `isOmitted()` instead, we can correctly use validation annotations like `@NotBlank`. Closes gh-842 --- .../support/ArgumentValueValueExtractor.java | 2 +- .../annotation/support/ValidationHelperTests.java | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/spring-graphql/src/main/java/org/springframework/graphql/data/method/annotation/support/ArgumentValueValueExtractor.java b/spring-graphql/src/main/java/org/springframework/graphql/data/method/annotation/support/ArgumentValueValueExtractor.java index b9ae78e9..f2f71c74 100644 --- a/spring-graphql/src/main/java/org/springframework/graphql/data/method/annotation/support/ArgumentValueValueExtractor.java +++ b/spring-graphql/src/main/java/org/springframework/graphql/data/method/annotation/support/ArgumentValueValueExtractor.java @@ -32,7 +32,7 @@ public final class ArgumentValueValueExtractor implements ValueExtractor argumentValue, ValueReceiver receiver) { - if (argumentValue.isPresent()) { + if (!argumentValue.isOmitted()) { receiver.value(null, argumentValue.value()); } } 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 2d9b394f..4b0abbf4 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 @@ -73,6 +73,18 @@ class ValidationHelperTests { BiConsumer validator3 = validateFunction(MyBean.class, "myValidArgumentValue"); assertViolation(() -> validator3.accept(bean, new Object[] {ArgumentValue.ofNullable("")}), "myValidArgumentValue.arg0"); + + // Validate that an explicit null value is validated. + assertViolation(() -> validator3.accept(bean, new Object[] {ArgumentValue.ofNullable(null)}), "myValidArgumentValue.arg0"); + } + + @Test + void shouldNotRaiseValidationErrorForOmittedArgumentValue() { + MyBean bean = new MyBean(); + + // Validate that an omitted value is allowed. + BiConsumer validator3 = validateFunction(MyBean.class, "myValidArgumentValue"); + validator3.accept(bean, new Object[] {ArgumentValue.omitted()}); } @Test