java - graphql-java 循环类型依赖

标签 java graphql 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();
    }

}

不可能实例化这个类,因为我遇到了这个异常

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)

很明显,在 createStudentType() 引用它时,classType 还没有实例化。我该如何解决这个问题?

最佳答案

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();
    }

}

关于java - graphql-java 循环类型依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38240599/

相关文章:

java - 如何使用 Cassandra Java 驱动程序访问带有嵌套映射的列表

database - 如何从数据库获取用于Graphql中分页的光标?

java - 将 java 实体映射到 GraphQL 对象

graphql - 如何将 graphiql 连接到 javascript 以外的其他实现

java - 如何在 Java 中结合使用 Spark RDD 和 PairRDD

java - 如何从android中的特定JSON对象获取ArrayList?

java - Spring Integration 代理网关上的入站转换器

reactjs - 使用 Apollo 替换 Redux 进行本地状态管理

reactjs - 在 Gatsby 上,如何使用 prop 进行 GraphQL 查询?

java - Apollo 客户端无法连接到 GraphQL 服务器(http 调用执行失败)