smallrye-graphql icon indicating copy to clipboard operation
smallrye-graphql copied to clipboard

`@DefaultValue("0") int x` fails with `null`

Open t1 opened this issue 3 years ago • 2 comments

If a client sends a null value (e.g. in the variables), the server throws an IllegalArgumentException.

t1 avatar Sep 21 '22 10:09 t1

I have a patch for the tck to show the problem, but I didn't find the correct spot to fix it, as I can't find a way to properly debug.

Index: server/tck/src/test/java/io/smallrye/graphql/test/apps/scalars/api/AdditionalScalarsApi.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/server/tck/src/test/java/io/smallrye/graphql/test/apps/scalars/api/AdditionalScalarsApi.java b/server/tck/src/test/java/io/smallrye/graphql/test/apps/scalars/api/AdditionalScalarsApi.java
--- a/server/tck/src/test/java/io/smallrye/graphql/test/apps/scalars/api/AdditionalScalarsApi.java	(revision d15bbd47085f2dceddf4d5e655d3cc459fb008b2)
+++ b/server/tck/src/test/java/io/smallrye/graphql/test/apps/scalars/api/AdditionalScalarsApi.java	(date 1663865822072)
@@ -46,4 +46,9 @@
             @DefaultValue("037f4ba2-6d74-4686-a4ea-90cbd86007c3") UUID uuid) {
         return uuid;
     }
+
+    public int intDefault(@Source AdditionalScalars additionalScalars,
+            @DefaultValue("5") int i) {
+        return i;
+    }
 }
Index: server/tck/src/test/resources/tests/scalars/spec/output.json
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/server/tck/src/test/resources/tests/scalars/spec/output.json b/server/tck/src/test/resources/tests/scalars/spec/output.json
--- a/server/tck/src/test/resources/tests/scalars/spec/output.json	(revision d15bbd47085f2dceddf4d5e655d3cc459fb008b2)
+++ b/server/tck/src/test/resources/tests/scalars/spec/output.json	(date 1663865822065)
@@ -10,7 +10,8 @@
       "uuidInput": "037f4ba2-6d74-4686-a4ea-90cbd86007c3",
       "urlDefault": "https://example.com",
       "uriDefault": "https://example.com",
-      "uuidDefault": "037f4ba2-6d74-4686-a4ea-90cbd86007c3"
+      "uuidDefault": "037f4ba2-6d74-4686-a4ea-90cbd86007c3",
+      "intDefault": 5
     }
   }
 }
Index: server/tck/src/test/resources/tests/scalars/spec/input.graphql
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/server/tck/src/test/resources/tests/scalars/spec/input.graphql b/server/tck/src/test/resources/tests/scalars/spec/input.graphql
--- a/server/tck/src/test/resources/tests/scalars/spec/input.graphql	(revision d15bbd47085f2dceddf4d5e655d3cc459fb008b2)
+++ b/server/tck/src/test/resources/tests/scalars/spec/input.graphql	(date 1663865822069)
@@ -10,5 +10,6 @@
     urlDefault
     uriDefault
     uuidDefault
+    intDefault(i: null)
   }
 }

t1 avatar Sep 23 '22 06:09 t1

this is the stacktrace:

ERROR: SRGQL012000: Data Fetching Error
java.lang.IllegalArgumentException
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
	at io.smallrye.graphql.execution.datafetcher.helper.ReflectionInvoker.invoke(ReflectionInvoker.java:92)
	at io.smallrye.graphql.execution.datafetcher.DefaultDataFetcher.invokeAndTransform(DefaultDataFetcher.java:33)
	at io.smallrye.graphql.execution.datafetcher.AbstractDataFetcher.get(AbstractDataFetcher.java:63)
	at graphql.execution.ExecutionStrategy.fetchField(ExecutionStrategy.java:282)
	at graphql.execution.ExecutionStrategy.resolveFieldWithInfo(ExecutionStrategy.java:211)
	at graphql.execution.AsyncExecutionStrategy.execute(AsyncExecutionStrategy.java:59)
	at graphql.execution.ExecutionStrategy.completeValueForObject(ExecutionStrategy.java:670)
	at graphql.execution.ExecutionStrategy.completeValue(ExecutionStrategy.java:457)
	at graphql.execution.ExecutionStrategy.completeField(ExecutionStrategy.java:407)
	at graphql.execution.ExecutionStrategy.lambda$resolveFieldWithInfo$1(ExecutionStrategy.java:213)
	at java.base/java.util.concurrent.CompletableFuture.uniApplyNow(CompletableFuture.java:680)
	at java.base/java.util.concurrent.CompletableFuture.uniApplyStage(CompletableFuture.java:658)
	at java.base/java.util.concurrent.CompletableFuture.thenApply(CompletableFuture.java:2094)
	at graphql.execution.ExecutionStrategy.resolveFieldWithInfo(ExecutionStrategy.java:212)
	at graphql.execution.AsyncExecutionStrategy.execute(AsyncExecutionStrategy.java:59)
	at graphql.execution.Execution.executeOperation(Execution.java:159)
	at graphql.execution.Execution.execute(Execution.java:105)
	at graphql.GraphQL.execute(GraphQL.java:645)
	at graphql.GraphQL.lambda$parseValidateAndExecute$11(GraphQL.java:564)
	at java.base/java.util.concurrent.CompletableFuture.uniComposeStage(CompletableFuture.java:1106)
	at java.base/java.util.concurrent.CompletableFuture.thenCompose(CompletableFuture.java:2235)
	at graphql.GraphQL.parseValidateAndExecute(GraphQL.java:559)
	at graphql.GraphQL.executeAsync(GraphQL.java:527)
	at graphql.GraphQL.execute(GraphQL.java:453)
	at io.smallrye.graphql.execution.ExecutionService.writeSync(ExecutionService.java:224)
	at io.smallrye.graphql.execution.ExecutionService.execute(ExecutionService.java:181)
	at io.smallrye.graphql.execution.ExecutionService.executeSync(ExecutionService.java:112)
	at io.smallrye.graphql.execution.ExecutionService.executeSync(ExecutionService.java:108)
	at io.smallrye.graphql.entry.http.ExecutionServlet.doPost(ExecutionServlet.java:73)
	at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:520)
	at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:587)
	at org.eclipse.jetty.servlet.ServletHolder$NotAsync.service(ServletHolder.java:1410)
	at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:764)
	at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:529)
	at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:131)
	at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:578)
	at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:122)
	at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:223)
	at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1571)
	at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:221)
	at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1375)
	at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:176)
	at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:484)
	at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1544)
	at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:174)
	at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1297)
	at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:129)
	at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:149)
	at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:141)
	at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:122)
	at org.eclipse.jetty.server.Server.handle(Server.java:562)
	at org.eclipse.jetty.server.HttpChannel.lambda$handle$0(HttpChannel.java:505)
	at org.eclipse.jetty.server.HttpChannel.dispatch(HttpChannel.java:762)
	at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:497)
	at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:282)
	at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:319)
	at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:100)
	at org.eclipse.jetty.io.SelectableChannelEndPoint$1.run(SelectableChannelEndPoint.java:53)
	at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.runTask(AdaptiveExecutionStrategy.java:412)
	at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.consumeTask(AdaptiveExecutionStrategy.java:381)
	at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.tryProduce(AdaptiveExecutionStrategy.java:268)
	at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.produce(AdaptiveExecutionStrategy.java:190)
	at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:894)
	at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1038)
	at java.base/java.lang.Thread.run(Thread.java:829)

t1 avatar Sep 23 '22 06:09 t1