2016-07-07 2 views
2

я ударил в кирпичную стену, пытаясь построить типы, которые зависят друг от друга, вот код:graphql-ява циклических типов зависимости

import graphql.schema.GraphQLObjectType; 
import static graphql.schema.GraphQLObjectType.newObject; 

import static graphql.Scalars.*; 
import graphql.schema.GraphQLFieldDefinition; 
import graphql.schema.GraphQLList; 

import static graphql.schema.GraphQLFieldDefinition.newFieldDefinition; 

public class GraphQLTypes { 

    private GraphQLObjectType studentType; 
    private GraphQLObjectType classType; 

    public GraphQLTypes() { 

     createStudentType(); 
     createClassType(); 
    } 

    void createStudentType() { 
     studentType = newObject().name("Student") 
       .field(newFieldDefinition().name("name").type(GraphQLString).build()) 
      .field(newFieldDefinition().name("currentClass").type(classType).build()) 
      .build(); 
    } 

    void createClassType() { 
     classType = newObject().name("Class") 
      .field(newFieldDefinition().name("name").type(GraphQLString).build()) 
      .field(newFieldDefinition().name("students").type(new GraphQLList(studentType)).build()) 
      .build(); 
    } 

} 

его невозможно intantiate этого класса, как я получаю это исключение

Caused by: graphql.AssertException: type can't be null 
at graphql.Assert.assertNotNull(Assert.java:10) 
at graphql.schema.GraphQLFieldDefinition.<init>(GraphQLFieldDefinition.java:23) 
at graphql.schema.GraphQLFieldDefinition$Builder.build(GraphQLFieldDefinition.java:152) 
at graphql_types.GraphQLTypes.createStudentType(GraphQLTypes.java:26) 
at graphql_types.GraphQLTypes.<init>(GraphQLTypes.java:19) 

очевидно ClassType еще не intantiated в точке createStudentType() будет ссылаться на него. Как обойти эту проблему?

ответ

4

GraphQLTypeReference - это действительно ответ. Это должно сделать это:

import graphql.schema.GraphQLList; 
import graphql.schema.GraphQLObjectType; 
import graphql.schema.GraphQLTypeReference; 

import static graphql.Scalars.GraphQLString; 
import static graphql.schema.GraphQLFieldDefinition.newFieldDefinition; 
import static graphql.schema.GraphQLObjectType.newObject; 

public class GraphQLTypes { 

    private GraphQLObjectType studentType; 
    private GraphQLObjectType classType; 

    public GraphQLTypes() { 
     createStudentType(); 
     createClassType(); 
    } 

    void createStudentType() { 
     studentType = newObject().name("Student") 
       .field(newFieldDefinition().name("name").type(GraphQLString).build()) 
       .field(newFieldDefinition().name("currentClass").type(new GraphQLTypeReference("Class")).build()) 
       .build(); 
    } 

    void createClassType() { 
     classType = newObject().name("Class") 
       .field(newFieldDefinition().name("name").type(GraphQLString).build()) 
       .field(newFieldDefinition().name("students").type(new GraphQLList(studentType)).build()) 
       .build(); 
    } 

} 
+0

Presto !!! Спасибо чувак. – Peace

Смежные вопросы