From b830fe9f3a5766cf4951978e9ce3d94574afcbc8 Mon Sep 17 00:00:00 2001 From: Brian Clozel Date: Wed, 22 Sep 2021 11:06:46 +0200 Subject: [PATCH] Fix NPE for non-required missing input arguments Prior to this commit, a missing, non-required input argument would throw an NullPointerException instead of returning `null` or `Optional.empty()`. Fixes gh-144 --- .../ArgumentMethodArgumentResolver.java | 2 +- .../ArgumentMethodArgumentResolverTests.java | 28 +++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/spring-graphql/src/main/java/org/springframework/graphql/data/method/annotation/support/ArgumentMethodArgumentResolver.java b/spring-graphql/src/main/java/org/springframework/graphql/data/method/annotation/support/ArgumentMethodArgumentResolver.java index 1733a04f..0145b3a2 100644 --- a/spring-graphql/src/main/java/org/springframework/graphql/data/method/annotation/support/ArgumentMethodArgumentResolver.java +++ b/spring-graphql/src/main/java/org/springframework/graphql/data/method/annotation/support/ArgumentMethodArgumentResolver.java @@ -74,7 +74,7 @@ public class ArgumentMethodArgumentResolver implements HandlerMethodArgumentReso if (annotation.required()) { throw new MissingArgumentException(name, parameter); } - returnValue(rawValue, parameterType.getType()); + return returnValue(rawValue, parameterType.getType()); } if (CollectionFactory.isApproximableCollectionType(rawValue.getClass())) { diff --git a/spring-graphql/src/test/java/org/springframework/graphql/data/method/annotation/support/ArgumentMethodArgumentResolverTests.java b/spring-graphql/src/test/java/org/springframework/graphql/data/method/annotation/support/ArgumentMethodArgumentResolverTests.java index e4d32788..d369feb5 100644 --- a/spring-graphql/src/test/java/org/springframework/graphql/data/method/annotation/support/ArgumentMethodArgumentResolverTests.java +++ b/spring-graphql/src/test/java/org/springframework/graphql/data/method/annotation/support/ArgumentMethodArgumentResolverTests.java @@ -96,6 +96,16 @@ class ArgumentMethodArgumentResolverTests { assertThat(result).isNotNull().isInstanceOf(Long.class).isEqualTo(42L); } + @Test + void shouldNotFailIfArgumentNotRequired() throws Exception { + Method findByKeywords = ClassUtils.getMethod(BookController.class, "findByKeywords", List.class); + String payload = "{ }"; + DataFetchingEnvironment environment = initEnvironment(payload); + MethodParameter methodParameter = getMethodParameter(findByKeywords, 0); + Object result = resolver.resolveArgument(methodParameter, environment); + assertThat(result).isNull(); + } + @Test void shouldResolveListOfJavaBeansArgument() throws Exception { Method addBooks = ClassUtils.getMethod(BookController.class, "addBooks", List.class); @@ -137,6 +147,11 @@ class ArgumentMethodArgumentResolverTests { return null; } + @QueryMapping + public Book findByKeywords(@Argument(required = false) List keywords) { + return null; + } + @MutationMapping public Book addBook(@Argument BookInput bookInput) { return null; @@ -172,4 +187,17 @@ class ArgumentMethodArgumentResolverTests { } } + static class Keyword { + + String term; + + public String getTerm() { + return this.term; + } + + public void setTerm(String term) { + this.term = term; + } + } + } \ No newline at end of file