Sam
Sam

Reputation: 23

GraphQL - SchemaError:

Building a microservice in java using -

spring-boot version 2.2.6.RELEASE graphql-spring-boot-starter version 5.0.2

Trying to persist record in MongoDB using graphql mutation, I successfully persisted through Single Object like below -

type ParentElement {
  id: ID!
  type: String
  child: String
}

But when trying out with nested object, I am seeing following error -

Caused by: com.coxautodev.graphql.tools.SchemaError: Expected type 'ChildElement' 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?

My Schema is as follows -

schema {
    query: Query
    mutation: Mutation
}

type ChildElement {
  make: String
  model: String
}

type ParentElement {
  id: ID!
  type: String
  child: ChildElement
}

type Query {
    findAllElements: [ParentElement]
}

type Mutation {
    createElement(id: String, type: String, child: ChildElement): ParentElement
}

Pojo Classes & Mutation are as follows -

@Document(collection="custom_element")
public class ParentElement {    
    private String id;
    private String type;
    private ChildElement child;
}

public class ChildElement {
    private String make;
    private String model;
}

@Component
public class ElementMutation implements GraphQLMutationResolver {
    private ElementRepository elementRepository;
    public ElementMutation(ElementRepository elementRepository) {
        this.elementRepository = elementRepository;
    }
    public ParentElement createElement(String id, String type, ChildElement child) {        
        ParentElement element = new ParentElement()

        elementRepository.save(element);
        return element;
    }
}

@Component
public class ElementQuery implements GraphQLQueryResolver {
    private ElementRepository elementRepository;
    @Autowired
    public ElementQuery(ElementRepository elementRepository) {
        this.elementRepository = elementRepository;
    }
    public Iterable<ParentElement> findAllElements() {
        return elementRepository.findAll();
    }
}

@Repository
public interface ElementRepository extends MongoRepository<ParentElement, String>{
}

I want to save following json representation in mongo db -

{
    "id": "custom_id",
    "type": "custom_type",
    "child": {
      "make": "custom_make",
      "model": "Toyota V6",
     }
}

I tried several things but when starting server always getting same exception. The above json is a simple representation. I want to save much more complex one, the difference with other examples available online is that I don't want to create separate mongo object for child element as shown with Book-Author example available online.

Upvotes: 0

Views: 679

Answers (1)

AllirionX
AllirionX

Reputation: 1143

Graphql type and input are two different things. You cannot use a type as a mutation input. That is exactly what the exception is about: Expected type 'ChildElement' to be a GraphQLInputType, but it wasn't, the library was expecting an input but found something else (an object type).

To solve that problem, create a child input:

input ChildInput {
  make: String
  model: String
}

type Mutation {
    createElement(id: String, type: String, child: ChildInput): ParentElement
}

You can also have a look at this question: Can you make a graphql type both an input and output type?

Upvotes: 2

Related Questions