graphql-spring-boot icon indicating copy to clipboard operation
graphql-spring-boot copied to clipboard

Using Upload scalar doesn't work with input object

Open ivans opened this issue 4 years ago • 10 comments

File upload works great if Upload is a direct input parameter of a query or nested in an array, but fails if it is nested.

Here are the examples to demonstrate:

with this in schema:

type Query {
    test1(input: Upload): ID!
    test2(input: [Upload]): ID!
    test3(input: FileInput): ID!
    test4(input: [FileInput]): ID!
}

scalar Upload

input FileInput {
    name: String!
    file: Upload
}

FileInput is mapped to this java class:

@lombok.Data
@lombok.NoArgsConstructor
public class FileInputDTO {

  String name;
  
  Part file;
}

The first two queries work great when called like this:

curl --location --request POST 'http://localhost:8080/graphql' \
--form 'operations={ "query": "query test1query($input: Upload) {test1 (input: $input) }", "variables": {"input": null } } }' \
--form 'map={ "file0": ["variables.input"] }' \
--form 'file0=@/home/ivan/Downloads/2020-02-13-raspbian-buster-full.zip'

curl --location --request POST 'http://localhost:8080/graphql' \
--form 'operations={ "query": "query test2query($input: [Upload]) {test2 (input: $input) }", "variables": {"input": [null, null] } } }' \
--form 'map={ "file0": ["variables.input.0"], "file1": ["variables.input.1"] }' \
--form 'file0=@/home/ivan/Slike/GOPR6667.MP4' \
--form 'file1=@/home/ivan/Slike/GOPR6665.MP4'

But the last two (with Upload contained in another input type fail:

# called this way:
curl --location --request POST 'http://localhost:8080/graphql' \
--form 'operations={ "query": "query test3query($input: FileInput) {test3 (input: $input) }", "variables": {"input": {"name": "file0.txt", "file": null } } }' \
--form 'map={ "file0": ["variables.input.file"] }' \
--form 'file0=@/home/ivan/Slike/s gopro/GOPR6667.MP4'

The exception that is thrown:

java.lang.IllegalArgumentException: Cannot construct instance of `javax.servlet.http.Part` (no Creators, like default construct, exist): abstract types either need to be mapped to concrete types, have custom deserializer, or contain additional type information
 at [Source: UNKNOWN; line: -1, column: -1] (through reference chain: hr.verox.engeon.model.dto.FileInputDTO["file"])
	at com.fasterxml.jackson.databind.ObjectMapper._convert(ObjectMapper.java:3922) ~[jackson-databind-2.10.1.jar:2.10.1]
	at com.fasterxml.jackson.databind.ObjectMapper.convertValue(ObjectMapper.java:3863) ~[jackson-databind-2.10.1.jar:2.10.1]
	at graphql.kickstart.tools.MethodFieldResolver$createDataFetcher$$inlined$forEachIndexed$lambda$1.invoke(MethodFieldResolver.kt:100) ~[graphql-java-tools-6.0.2.jar:na]
	at graphql.kickstart.tools.MethodFieldResolver$createDataFetcher$$inlined$forEachIndexed$lambda$1.invoke(MethodFieldResolver.kt:25) ~[graphql-java-tools-6.0.2.jar:na]
	at graphql.kickstart.tools.MethodFieldResolverDataFetcher.get(MethodFieldResolver.kt:201) ~[graphql-java-tools-6.0.2.jar:na]
	at graphql.execution.ExecutionStrategy.fetchField(ExecutionStrategy.java:272) ~[graphql-java-14.0.jar:na]
	at graphql.execution.ExecutionStrategy.resolveFieldWithInfo(ExecutionStrategy.java:200) ~[graphql-java-14.0.jar:na]
	at graphql.execution.AsyncExecutionStrategy.execute(AsyncExecutionStrategy.java:74) ~[graphql-java-14.0.jar:na]
	at graphql.execution.Execution.executeOperation(Execution.java:165) ~[graphql-java-14.0.jar:na]
	at graphql.execution.Execution.execute(Execution.java:106) ~[graphql-java-14.0.jar:na]
	at graphql.GraphQL.execute(GraphQL.java:623) ~[graphql-java-14.0.jar:na]
	at graphql.GraphQL.parseValidateAndExecute(GraphQL.java:556) ~[graphql-java-14.0.jar:na]
	at graphql.GraphQL.executeAsync(GraphQL.java:520) ~[graphql-java-14.0.jar:na]
	at graphql.kickstart.execution.GraphQLInvoker.executeAsync(GraphQLInvoker.java:26) ~[graphql-java-kickstart-9.1.0.jar:na]
	at graphql.kickstart.execution.GraphQLInvoker.query(GraphQLInvoker.java:38) ~[graphql-java-kickstart-9.1.0.jar:na]
	at graphql.kickstart.execution.GraphQLInvoker.query(GraphQLInvoker.java:31) ~[graphql-java-kickstart-9.1.0.jar:na]
	at graphql.kickstart.servlet.HttpRequestHandlerImpl.invoke(HttpRequestHandlerImpl.java:67) ~[graphql-java-servlet-9.1.0.jar:na]
	at graphql.kickstart.servlet.HttpRequestHandlerImpl.execute(HttpRequestHandlerImpl.java:52) ~[graphql-java-servlet-9.1.0.jar:na]
	at graphql.kickstart.servlet.HttpRequestHandlerImpl.handle(HttpRequestHandlerImpl.java:37) ~[graphql-java-servlet-9.1.0.jar:na]
	at graphql.kickstart.servlet.AbstractGraphQLHttpServlet.doRequest(AbstractGraphQLHttpServlet.java:147) ~[graphql-java-servlet-9.1.0.jar:na]
	at graphql.kickstart.servlet.AbstractGraphQLHttpServlet.doRequestAsync(AbstractGraphQLHttpServlet.java:137) ~[graphql-java-servlet-9.1.0.jar:na]
	at graphql.kickstart.servlet.AbstractGraphQLHttpServlet.doPost(AbstractGraphQLHttpServlet.java:169) ~[graphql-java-servlet-9.1.0.jar:na]
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:660) ~[tomcat-embed-core-9.0.29.jar:9.0.29]

ivans avatar Apr 27 '20 07:04 ivans

This has been fixed in graphql-java-tools 6.0.0. You report this in graphql-java-servlet, but this is from the logs it's clear you're using graphql-java-tools as well, and probably using it together with the spring-boot-starter. In those cases register the issue int he graphql-spring-boot-starter project please.

For now try updating to the latest version of graphql-spring-boot-starter and let it pull in the latest version of graphql-java-tools and servlet. As said above it should already be fixed there, because this particular use case was part of that.

oliemansm avatar Apr 27 '20 07:04 oliemansm

Thanks! I am on the latest version of graphql-spring-boot-starter. And I think all the other libraries are at latest versions: com.graphql-java-kickstart:graphql-spring-boot-starter:jar:7.0.1 com.graphql-java:graphql-java:jar:14.0 com.graphql-java-kickstart:graphql-java-servlet:jar:9.1.0

ivans avatar Apr 27 '20 08:04 ivans

Hmm that's strange. There were some more changes after this, so could be it's changed in the snapshot release. If you have time, please check if that's true or not. Otherwise I'll have to take a look at it when I have the time.

I'll transfer this issue to the spring-boot project btw.

oliemansm avatar Apr 27 '20 08:04 oliemansm

Hmm that's strange. There were some more changes after this, so could be it's changed in the snapshot release. If you have time, please check if that's true or not. Otherwise I'll have to take a look at it when I have the time.

Same exception on 7.1.0-SNAPSHOT.

ivans avatar Apr 27 '20 11:04 ivans

I can confirm and have the same problem with graphql-java-tools:6.0.2. The problem is not actually with Jackson as the exceptions seems to indicate, but that the coercion isn't called for custom scalars within input types.

maxdavidguenther avatar Apr 27 '20 13:04 maxdavidguenther

I'm pretty sure I'm having the same or similar problem. I have a custom scalar GeoJson which wraps a GeoJson Geometry. If I use it in a query or as a direct input to a mutation it works great. However, if I use it nested in an input type with a mutation I get an error. As far as I can tell, my scalar is being coerced, but somewhere in graphql.kickstart.tools.MethodFieldResolverDataFetcher.get(MethodFieldResolver.kt:201) it is being serialized and deserialized and this ser/deser is dropping the type field from the json for the geometry.

scalar GeoJson

type Mutation {
    test1(geom: GeoJson!): String! #works
    test2(namedGeom: GeomWithName): String! #doesn't work
}

input GeomWithName {
    name: String!
    geom: GeoJson!
}

Sample Input:

mutation($geom: GeoJson!){
  test2(namedGeom: {name: "Foo", geom: $geom})
}

{"geom": {"type":"Point","coordinates":[19.335937499999996,35.460669951495305]}}
@AllArgsConstructor
@Builder(toBuilder = true)
@Data
@NoArgsConstructor
public class GeomWithName {
    String name;
    GeoJsonObject geom;
}
@Component
@RequiredArgsConstructor
@Slf4j
public class AlertEventMutationResolver implements GraphQLMutationResolver {
    CompletableFuture<String> test1(GeoJsonObject geom) {
        log.info(geom.toString());
        return CompletableFuture.completedFuture("Success");
    }

    CompletableFuture<String> test2(GeomWithName geom) {
        //Never gets here
        log.info(geom.toString());
        return CompletableFuture.completedFuture("Fails");
    }
}
n.g.e.SimpleDataFetcherExceptionHandler  : Exception while fetching data (/test2) : Missing type id when trying to resolve subtype of [simple type, class org.geojson.GeoJsonObject]: missing type id property 'type' (for POJO property 'geom')
 at [Source: UNKNOWN; line: -1, column: -1] (through reference chain: com.he360.alerting.events.GeomWithName["geom"])

java.lang.IllegalArgumentException: Missing type id when trying to resolve subtype of [simple type, class org.geojson.GeoJsonObject]: missing type id property 'type' (for POJO property 'geom')
 at [Source: UNKNOWN; line: -1, column: -1] (through reference chain: com.he360.alerting.events.GeomWithName["geom"])
	at com.fasterxml.jackson.databind.ObjectMapper._convert(ObjectMapper.java:4234) ~[jackson-databind-2.11.2.jar:2.11.2]
	at com.fasterxml.jackson.databind.ObjectMapper.convertValue(ObjectMapper.java:4175) ~[jackson-databind-2.11.2.jar:2.11.2]
	at graphql.kickstart.tools.MethodFieldResolver$createDataFetcher$$inlined$forEachIndexed$lambda$1.invoke(MethodFieldResolver.kt:100) ~[graphql-java-tools-6.0.2.jar:na]
	at graphql.kickstart.tools.MethodFieldResolver$createDataFetcher$$inlined$forEachIndexed$lambda$1.invoke(MethodFieldResolver.kt:25) ~[graphql-java-tools-6.0.2.jar:na]
	at graphql.kickstart.tools.MethodFieldResolverDataFetcher.get(MethodFieldResolver.kt:201) ~[graphql-java-tools-6.0.2.jar:na]
	at graphql.execution.instrumentation.dataloader.DataLoaderDispatcherInstrumentation.lambda$instrumentDataFetcher$0(DataLoaderDispatcherInstrumentation.java:86) ~[graphql-java-14.0.jar:na]
	at graphql.execution.ExecutionStrategy.fetchField(ExecutionStrategy.java:272) ~[graphql-java-14.0.jar:na]
	at graphql.execution.ExecutionStrategy.resolveFieldWithInfo(ExecutionStrategy.java:200) ~[graphql-java-14.0.jar:na]
	at graphql.execution.AsyncExecutionStrategy.execute(AsyncExecutionStrategy.java:74) ~[graphql-java-14.0.jar:na]
	at graphql.execution.Execution.executeOperation(Execution.java:165) ~[graphql-java-14.0.jar:na]
	at graphql.execution.Execution.execute(Execution.java:106) ~[graphql-java-14.0.jar:na]
	at graphql.GraphQL.execute(GraphQL.java:623) ~[graphql-java-14.0.jar:na]
	at graphql.GraphQL.parseValidateAndExecute(GraphQL.java:556) ~[graphql-java-14.0.jar:na]
	at graphql.GraphQL.executeAsync(GraphQL.java:520) ~[graphql-java-14.0.jar:na]
	at graphql.kickstart.execution.GraphQLInvoker.executeAsync(GraphQLInvoker.java:26) ~[graphql-java-kickstart-9.1.0.jar:na]
	at graphql.kickstart.spring.webflux.GraphQLController.executeRequest(GraphQLController.java:35) ~[graphql-kickstart-spring-webflux-7.0.1.jar:na]
	at graphql.kickstart.spring.AbstractGraphQLController.graphqlPOST(AbstractGraphQLController.java:56) ~[graphql-kickstart-spring-support-7.0.1.jar:na]
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
	at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na]
	at org.springframework.web.reactive.result.method.InvocableHandlerMethod.lambda$invoke$0(InvocableHandlerMethod.java:147) ~[spring-webflux-5.2.8.RELEASE.jar:5.2.8.RELEASE]
	at reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:118) ~[reactor-core-3.3.9.RELEASE.jar:3.3.9.RELEASE]
	at reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1782) ~[reactor-core-3.3.9.RELEASE.jar:3.3.9.RELEASE]
	at reactor.core.publisher.MonoZip$ZipCoordinator.signal(MonoZip.java:247) ~[reactor-core-3.3.9.RELEASE.jar:3.3.9.RELEASE]
	at reactor.core.publisher.MonoZip$ZipInner.onNext(MonoZip.java:329) ~[reactor-core-3.3.9.RELEASE.jar:3.3.9.RELEASE]
	at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onNext(MonoPeekTerminal.java:173) ~[reactor-core-3.3.9.RELEASE.jar:3.3.9.RELEASE]
	at reactor.core.publisher.FluxDefaultIfEmpty$DefaultIfEmptySubscriber.onNext(FluxDefaultIfEmpty.java:92) ~[reactor-core-3.3.9.RELEASE.jar:3.3.9.RELEASE]
	at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onNext(FluxOnErrorResume.java:73) ~[reactor-core-3.3.9.RELEASE.jar:3.3.9.RELEASE]
	at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onNext(FluxMapFuseable.java:121) ~[reactor-core-3.3.9.RELEASE.jar:3.3.9.RELEASE]
	at reactor.core.publisher.FluxContextStart$ContextStartSubscriber.onNext(FluxContextStart.java:96) ~[reactor-core-3.3.9.RELEASE.jar:3.3.9.RELEASE]
	at reactor.core.publisher.FluxMapFuseable$MapFuseableConditionalSubscriber.onNext(FluxMapFuseable.java:287) ~[reactor-core-3.3.9.RELEASE.jar:3.3.9.RELEASE]
	at reactor.core.publisher.FluxFilterFuseable$FilterFuseableConditionalSubscriber.onNext(FluxFilterFuseable.java:330) ~[reactor-core-3.3.9.RELEASE.jar:3.3.9.RELEASE]
	at reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1782) ~[reactor-core-3.3.9.RELEASE.jar:3.3.9.RELEASE]
	at reactor.core.publisher.MonoCollect$CollectSubscriber.onComplete(MonoCollect.java:152) ~[reactor-core-3.3.9.RELEASE.jar:3.3.9.RELEASE]
	at reactor.core.publisher.FluxMap$MapSubscriber.onComplete(FluxMap.java:136) ~[reactor-core-3.3.9.RELEASE.jar:3.3.9.RELEASE]
	at reactor.core.publisher.FluxPeek$PeekSubscriber.onComplete(FluxPeek.java:252) ~[reactor-core-3.3.9.RELEASE.jar:3.3.9.RELEASE]
	at reactor.core.publisher.FluxMap$MapSubscriber.onComplete(FluxMap.java:136) ~[reactor-core-3.3.9.RELEASE.jar:3.3.9.RELEASE]
	at reactor.netty.channel.FluxReceive.onInboundComplete(FluxReceive.java:378) ~[reactor-netty-0.9.11.RELEASE.jar:0.9.11.RELEASE]
	at reactor.netty.channel.ChannelOperations.onInboundComplete(ChannelOperations.java:373) ~[reactor-netty-0.9.11.RELEASE.jar:0.9.11.RELEASE]
	at reactor.netty.http.server.HttpServerOperations.onInboundNext(HttpServerOperations.java:492) ~[reactor-netty-0.9.11.RELEASE.jar:0.9.11.RELEASE]
	at reactor.netty.channel.ChannelOperationsHandler.channelRead(ChannelOperationsHandler.java:96) ~[reactor-netty-0.9.11.RELEASE.jar:0.9.11.RELEASE]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) ~[netty-transport-4.1.51.Final.jar:4.1.51.Final]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) ~[netty-transport-4.1.51.Final.jar:4.1.51.Final]
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357) ~[netty-transport-4.1.51.Final.jar:4.1.51.Final]
	at reactor.netty.http.server.HttpTrafficHandler.channelRead(HttpTrafficHandler.java:214) ~[reactor-netty-0.9.11.RELEASE.jar:0.9.11.RELEASE]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) ~[netty-transport-4.1.51.Final.jar:4.1.51.Final]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) ~[netty-transport-4.1.51.Final.jar:4.1.51.Final]
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357) ~[netty-transport-4.1.51.Final.jar:4.1.51.Final]
	at io.netty.channel.CombinedChannelDuplexHandler$DelegatingChannelHandlerContext.fireChannelRead(CombinedChannelDuplexHandler.java:436) ~[netty-transport-4.1.51.Final.jar:4.1.51.Final]
	at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:324) ~[netty-codec-4.1.51.Final.jar:4.1.51.Final]
	at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:296) ~[netty-codec-4.1.51.Final.jar:4.1.51.Final]
	at io.netty.channel.CombinedChannelDuplexHandler.channelRead(CombinedChannelDuplexHandler.java:251) ~[netty-transport-4.1.51.Final.jar:4.1.51.Final]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) ~[netty-transport-4.1.51.Final.jar:4.1.51.Final]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) ~[netty-transport-4.1.51.Final.jar:4.1.51.Final]
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357) ~[netty-transport-4.1.51.Final.jar:4.1.51.Final]
	at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410) ~[netty-transport-4.1.51.Final.jar:4.1.51.Final]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) ~[netty-transport-4.1.51.Final.jar:4.1.51.Final]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) ~[netty-transport-4.1.51.Final.jar:4.1.51.Final]
	at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919) ~[netty-transport-4.1.51.Final.jar:4.1.51.Final]
	at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:163) ~[netty-transport-4.1.51.Final.jar:4.1.51.Final]
	at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:714) ~[netty-transport-4.1.51.Final.jar:4.1.51.Final]
	at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:650) ~[netty-transport-4.1.51.Final.jar:4.1.51.Final]
	at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:576) ~[netty-transport-4.1.51.Final.jar:4.1.51.Final]
	at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:493) ~[netty-transport-4.1.51.Final.jar:4.1.51.Final]
	at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989) ~[netty-common-4.1.51.Final.jar:4.1.51.Final]
	at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) ~[netty-common-4.1.51.Final.jar:4.1.51.Final]
	at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) ~[netty-common-4.1.51.Final.jar:4.1.51.Final]
	at java.base/java.lang.Thread.run(Thread.java:834) ~[na:na]
Caused by: com.fasterxml.jackson.databind.exc.InvalidTypeIdException: Missing type id when trying to resolve subtype of [simple type, class org.geojson.GeoJsonObject]: missing type id property 'type' (for POJO property 'geom')
 at [Source: UNKNOWN; line: -1, column: -1] (through reference chain: com.he360.alerting.events.GeomWithName["geom"])
	at com.fasterxml.jackson.databind.exc.InvalidTypeIdException.from(InvalidTypeIdException.java:43) ~[jackson-databind-2.11.2.jar:2.11.2]
	at com.fasterxml.jackson.databind.DeserializationContext.missingTypeIdException(DeserializationContext.java:1794) ~[jackson-databind-2.11.2.jar:2.11.2]
	at com.fasterxml.jackson.databind.DeserializationContext.handleMissingTypeId(DeserializationContext.java:1323) ~[jackson-databind-2.11.2.jar:2.11.2]
	at com.fasterxml.jackson.databind.jsontype.impl.TypeDeserializerBase._handleMissingTypeId(TypeDeserializerBase.java:303) ~[jackson-databind-2.11.2.jar:2.11.2]
	at com.fasterxml.jackson.databind.jsontype.impl.AsPropertyTypeDeserializer._deserializeTypedUsingDefaultImpl(AsPropertyTypeDeserializer.java:166) ~[jackson-databind-2.11.2.jar:2.11.2]
	at com.fasterxml.jackson.databind.jsontype.impl.AsPropertyTypeDeserializer.deserializeTypedFromObject(AsPropertyTypeDeserializer.java:107) ~[jackson-databind-2.11.2.jar:2.11.2]
	at com.fasterxml.jackson.databind.deser.AbstractDeserializer.deserializeWithType(AbstractDeserializer.java:254) ~[jackson-databind-2.11.2.jar:2.11.2]
	at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:138) ~[jackson-databind-2.11.2.jar:2.11.2]
	at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:371) ~[jackson-databind-2.11.2.jar:2.11.2]
	at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:164) ~[jackson-databind-2.11.2.jar:2.11.2]
	at com.fasterxml.jackson.databind.ObjectMapper._convert(ObjectMapper.java:4229) ~[jackson-databind-2.11.2.jar:2.11.2]
	... 68 common frames omitted

antinodes avatar Aug 22 '20 17:08 antinodes

@vojtapol Is this an issue that requires a fix in graphql-java-tools?

oliemansm avatar Dec 20 '20 11:12 oliemansm

graphql-java-tools 6.3.0 contains a fix for scalar issues: https://github.com/graphql-java-kickstart/graphql-java-tools/pull/453. This has been released with graphql-spring-boot version 8.1.0. Can somebody check if that resolves this issue now too?

oliemansm avatar Dec 20 '20 14:12 oliemansm

Opened a new issue for this in java-tools: https://github.com/graphql-java-kickstart/graphql-java-tools/issues/466

oryan-block avatar Dec 22 '20 15:12 oryan-block

Is it even appropriate to use the graphql-java-servlet in a netty server? How can it be achieved on a netty server?

thushar10 avatar Dec 22 '21 18:12 thushar10