2016-07-07 72 views
2

我已经打在试图构建一个互相依赖的类型砖墙,这里是代码:graphql Java的循环类型的依赖

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尚未在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