2016-07-07 104 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