【问题标题】:graphql-java cyclic types dependenciesgraphql-java 循环类型依赖
【发布时间】: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() 引用它时还没有实例化。我该如何解决这个问题?

【问题讨论】:

    标签: java graphql graphql-java


    【解决方案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

      【讨论】:

        猜你喜欢
        • 2017-07-20
        • 2017-07-15
        • 2018-10-14
        • 2018-07-17
        • 2011-12-01
        • 2020-10-27
        • 2016-08-24
        • 2017-05-09
        • 1970-01-01
        相关资源
        最近更新 更多