graphql-java 循环类型依赖
Posted
技术标签:
【中文标题】graphql-java 循环类型依赖【英文标题】:graphql-java cyclic types dependencies 【发布时间】:2016-11-09 11:37:43 【问题描述】:我在尝试构建相互依赖的类型时碰了壁,下面是代码:
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();
不可能实例化这个类,因为我得到了这个异常
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() 引用它时还没有实例化。我该如何解决这个问题?
【问题讨论】:
【参考方案1】: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();
【讨论】:
【参考方案2】:您是否尝试使用new GraphQLTypeReference("ForwardType")
?我说的是这个https://github.com/graphql-java/graphql-java#recursive-type-references
【讨论】:
以上是关于graphql-java 循环类型依赖的主要内容,如果未能解决你的问题,请参考以下文章