smallrye-graphql
smallrye-graphql copied to clipboard
`@DefaultValue("0") int x` fails with `null`
If a client sends a null value (e.g. in the variables), the server throws an IllegalArgumentException.
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)
}
}
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)