Skip to content

Custom scalars are not properly scanned when only used in input types #355

@mb-nick

Description

@mb-nick

I have some trouble with custom scalars that are only used in input types. I used the [https://github.com/graphql-java-kickstart/graphql-java-tools/tree/master/example](example from this repository) to recreate this problem. I've just added a scalar to the existing input type,

Schema:

scalar Foo

input CreateHumanInput {
    # The name of the human
    name: String
    # The home planet of the human, or null if unknown
    homePlanet: String
    # custom scalar
    foo: Foo
}

Spring Config

@Bean
    public GraphQLScalarType foo() {
        return GraphQLScalarType.newScalar(Scalars.GraphQLString)
                .name("Foo")
                .description("foo")
                .build();
    }

When I start the application I get the following exception (that's just the root cause)

Caused by: com.coxautodev.graphql.tools.SchemaError: Expected type 'Foo' to be a GraphQLInputType, but it wasn't!  Was a type only permitted for object types incorrectly used as an input type, or vice-versa?
	at com.coxautodev.graphql.tools.SchemaParser.determineType(SchemaParser.kt:331) ~[graphql-java-tools-5.5.0.jar:na]
	at com.coxautodev.graphql.tools.SchemaParser.determineInputType(SchemaParser.kt:319) ~[graphql-java-tools-5.5.0.jar:na]
	at com.coxautodev.graphql.tools.SchemaParser.createInputObject(SchemaParser.kt:196) ~[graphql-java-tools-5.5.0.jar:na]
	at com.coxautodev.graphql.tools.SchemaParser.parseSchemaObjects(SchemaParser.kt:105) ~[graphql-java-tools-5.5.0.jar:na]
	at com.coxautodev.graphql.tools.SchemaParser.makeExecutableSchema(SchemaParser.kt:130) ~[graphql-java-tools-5.5.0.jar:na]
	at com.oembedler.moon.graphql.boot.GraphQLJavaToolsAutoConfiguration.graphQLSchema(GraphQLJavaToolsAutoConfiguration.java:116) ~[graphql-spring-boot-autoconfigure-5.5.0.jar:na]
	at com.oembedler.moon.graphql.boot.GraphQLJavaToolsAutoConfiguration$$EnhancerBySpringCGLIB$$bd848caf.CGLIB$graphQLSchema$1(<generated>) ~[graphql-spring-boot-autoconfigure-5.5.0.jar:na]
	at com.oembedler.moon.graphql.boot.GraphQLJavaToolsAutoConfiguration$$EnhancerBySpringCGLIB$$bd848caf$$FastClassBySpringCGLIB$$2867ec26.invoke(<generated>) ~[graphql-spring-boot-autoconfigure-5.5.0.jar:na]
	at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:244) ~[spring-core-5.1.11.RELEASE.jar:5.1.11.RELEASE]
	at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:363) ~[spring-context-5.1.11.RELEASE.jar:5.1.11.RELEASE]
	at com.oembedler.moon.graphql.boot.GraphQLJavaToolsAutoConfiguration$$EnhancerBySpringCGLIB$$bd848caf.graphQLSchema(<generated>) ~[graphql-spring-boot-autoconfigure-5.5.0.jar:na]
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_212]
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_212]
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_212]
	at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_212]
	at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154) ~[spring-beans-5.1.11.RELEASE.jar:5.1.11.RELEASE]
	... 90 common frames omitted

In addition to the exception there is also a warning as one of the first log statements

Cannot find definition for field 'foo: Foo' on input type 'CreateHumanInput' -> java.util.Map.  or add a class to represent your input type instead of a Map.

The example in the repository uses version 5.5.0. I also tried version 5.7.1, which I use in the actual project. But that didn't change anything.

I also tried it with an explicitly defined SchemaParser.

@Bean
    public SchemaParser schemaParser(GraphQLScalarType foo, Query query, Mutation mutation) {
        return SchemaParser.newParser()
                .file("swapi.graphqls")
                .scalars(foo)
                .resolvers(query, mutation)
                .build();
    }

When I add the scalar to a normal (output) type, then it works. Although the above mentioned warning stays.

Is this a bug (I guess so) or did I do something wrong? Is there a workaround? Any help is appreciated.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions