Skip to content

Nullable boolean in input with default value throws CoercingSerializeException #251

Closed
@bsara

Description

@bsara

Describe the bug
When an input Boolean (nullable) property has a default value and the corresponding property in the Java class is of type Boolean (non-primitive); a CoercingSerializeException is thrown.

NOTE: I am using Kotlin and my property in the corresponding Kotlin class is of type Boolean?. I am also using the graphql-java-kickstart spring boot project and the graphql-java-tools library.

Stack trace I'm seeing:

graphql.schema.CoercingSerializeException: Expected type 'Boolean' but was 'BooleanValue'.
	at graphql.Scalars$4.serialize(Scalars.java:231) ~[graphql-java-11.0.jar:na]
	at graphql.Scalars$4.serialize(Scalars.java:204) ~[graphql-java-11.0.jar:na]
	at graphql.language.AstValueHelper.serialize(AstValueHelper.java:208) ~[graphql-java-11.0.jar:na]
	at graphql.language.AstValueHelper.astFromValue(AstValueHelper.java:86) ~[graphql-java-11.0.jar:na]
	at graphql.introspection.Introspection.print(Introspection.java:121) ~[graphql-java-11.0.jar:na]
	at graphql.introspection.Introspection.lambda$static$1(Introspection.java:114) ~[graphql-java-11.0.jar:na]
	at graphql.execution.ExecutionStrategy.fetchField(ExecutionStrategy.java:261) ~[graphql-java-11.0.jar:na]
	at graphql.execution.ExecutionStrategy.resolveFieldWithInfo(ExecutionStrategy.java:202) ~[graphql-java-11.0.jar:na]
	at graphql.execution.AsyncExecutionStrategy.execute(AsyncExecutionStrategy.java:70) ~[graphql-java-11.0.jar:na]
	at graphql.execution.ExecutionStrategy.completeValueForObject(ExecutionStrategy.java:636) ~[graphql-java-11.0.jar:na]
	at graphql.execution.ExecutionStrategy.completeValue(ExecutionStrategy.java:416) ~[graphql-java-11.0.jar:na]
	at graphql.execution.ExecutionStrategy.completeValueForList(ExecutionStrategy.java:515) ~[graphql-java-11.0.jar:na]
	at graphql.execution.ExecutionStrategy.completeValueForList(ExecutionStrategy.java:463) ~[graphql-java-11.0.jar:na]
	at graphql.execution.ExecutionStrategy.completeValue(ExecutionStrategy.java:401) ~[graphql-java-11.0.jar:na]
	at graphql.execution.ExecutionStrategy.completeField(ExecutionStrategy.java:366) ~[graphql-java-11.0.jar:na]
	at graphql.execution.ExecutionStrategy.lambda$resolveFieldWithInfo$0(ExecutionStrategy.java:204) ~[graphql-java-11.0.jar:na]
	at java.util.concurrent.CompletableFuture.uniApply(CompletableFuture.java:602) ~[na:1.8.0_191]
	at java.util.concurrent.CompletableFuture.uniApplyStage(CompletableFuture.java:614) ~[na:1.8.0_191]
	at java.util.concurrent.CompletableFuture.thenApply(CompletableFuture.java:1983) ~[na:1.8.0_191]
	at graphql.execution.ExecutionStrategy.resolveFieldWithInfo(ExecutionStrategy.java:203) ~[graphql-java-11.0.jar:na]
	at graphql.execution.AsyncExecutionStrategy.execute(AsyncExecutionStrategy.java:70) ~[graphql-java-11.0.jar:na]
	at graphql.execution.ExecutionStrategy.completeValueForObject(ExecutionStrategy.java:636) ~[graphql-java-11.0.jar:na]
	at graphql.execution.ExecutionStrategy.completeValue(ExecutionStrategy.java:416) ~[graphql-java-11.0.jar:na]
	at graphql.execution.ExecutionStrategy.completeValueForList(ExecutionStrategy.java:515) ~[graphql-java-11.0.jar:na]
	at graphql.execution.ExecutionStrategy.completeValueForList(ExecutionStrategy.java:463) ~[graphql-java-11.0.jar:na]
	at graphql.execution.ExecutionStrategy.completeValue(ExecutionStrategy.java:401) ~[graphql-java-11.0.jar:na]
	at graphql.execution.ExecutionStrategy.completeField(ExecutionStrategy.java:366) ~[graphql-java-11.0.jar:na]
	at graphql.execution.ExecutionStrategy.lambda$resolveFieldWithInfo$0(ExecutionStrategy.java:204) ~[graphql-java-11.0.jar:na]
	at java.util.concurrent.CompletableFuture.uniApply(CompletableFuture.java:602) ~[na:1.8.0_191]
	at java.util.concurrent.CompletableFuture.uniApplyStage(CompletableFuture.java:614) ~[na:1.8.0_191]
	at java.util.concurrent.CompletableFuture.thenApply(CompletableFuture.java:1983) ~[na:1.8.0_191]
	at graphql.execution.ExecutionStrategy.resolveFieldWithInfo(ExecutionStrategy.java:203) ~[graphql-java-11.0.jar:na]
	at graphql.execution.AsyncExecutionStrategy.execute(AsyncExecutionStrategy.java:70) ~[graphql-java-11.0.jar:na]
	at graphql.execution.ExecutionStrategy.completeValueForObject(ExecutionStrategy.java:636) ~[graphql-java-11.0.jar:na]
	at graphql.execution.ExecutionStrategy.completeValue(ExecutionStrategy.java:416) ~[graphql-java-11.0.jar:na]
	at graphql.execution.ExecutionStrategy.completeField(ExecutionStrategy.java:366) ~[graphql-java-11.0.jar:na]
	at graphql.execution.ExecutionStrategy.lambda$resolveFieldWithInfo$0(ExecutionStrategy.java:204) ~[graphql-java-11.0.jar:na]
	at java.util.concurrent.CompletableFuture.uniApply(CompletableFuture.java:602) ~[na:1.8.0_191]
	at java.util.concurrent.CompletableFuture.uniApplyStage(CompletableFuture.java:614) ~[na:1.8.0_191]
	at java.util.concurrent.CompletableFuture.thenApply(CompletableFuture.java:1983) ~[na:1.8.0_191]
	at graphql.execution.ExecutionStrategy.resolveFieldWithInfo(ExecutionStrategy.java:203) ~[graphql-java-11.0.jar:na]
	at graphql.execution.AsyncExecutionStrategy.execute(AsyncExecutionStrategy.java:70) ~[graphql-java-11.0.jar:na]
	at graphql.execution.Execution.executeOperation(Execution.java:159) ~[graphql-java-11.0.jar:na]
	at graphql.execution.Execution.execute(Execution.java:101) ~[graphql-java-11.0.jar:na]
	at graphql.GraphQL.execute(GraphQL.java:573) ~[graphql-java-11.0.jar:na]
	at graphql.GraphQL.parseValidateAndExecute(GraphQL.java:515) ~[graphql-java-11.0.jar:na]
	at graphql.GraphQL.executeAsync(GraphQL.java:489) ~[graphql-java-11.0.jar:na]
	at graphql.GraphQL.execute(GraphQL.java:420) ~[graphql-java-11.0.jar:na]

To Reproduce

Schema:

input QueryParams {
  active: Boolean = true
}

extend type Query {
  items(queryParams: QueryParams!): [Item!]!
}

Kotlin class that represents QueryParams:

class QueryParams @JvmOverloads constructor(
  var active: Boolean? = null
)

Query Resolver:

class ItemQueryResolver : GraphQLQueryResolver {
  fun items(queryParams: QueryParams, env: DataFetchingEnvironment): CompletableFuture<Collection<Item>> {
    return supplyAsync {
      listOf()
    }
  }
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions