使用 GraphQLObjectType 的世界你好

Posted

技术标签:

【中文标题】使用 GraphQLObjectType 的世界你好【英文标题】:Hello world with GraphQLObjectType 【发布时间】:2016-08-14 01:24:33 【问题描述】:

我正在执行下面的代码,结果是:

TestPojo=id=null, name=null

我期待结果是TestPojo=id="1", name="Jack"。我错过了什么?

import static graphql.Scalars.GraphQLString;
import static graphql.schema.GraphQLFieldDefinition.newFieldDefinition;
import static graphql.schema.GraphQLObjectType.newObject;

import java.util.Map;

import graphql.GraphQL;
import graphql.schema.DataFetcher;
import graphql.schema.DataFetchingEnvironment;
import graphql.schema.GraphQLObjectType;
import graphql.schema.GraphQLSchema;

public class HelloWorld 
    public static void main(String[] args) 
        // sub schema to be added to parent schema
        GraphQLObjectType testPojo = newObject().name("TestPojo")
                                                .description("This is a test POJO")
                                                .field(newFieldDefinition().name("id").type(GraphQLString).build())
                                                .field(newFieldDefinition().name("name").type(GraphQLString).build())
                                                .build();
        // parent schema
        GraphQLObjectType queryType = newObject().name("helloWorldQuery")
                                                 .field(newFieldDefinition().name(testPojo.getName())
                                                                            .type(testPojo)
                                                                            .dataFetcher(new DataFetcher() 
                                                                                @Override
                                                                                public Object get(DataFetchingEnvironment arg0) 
                                                                                    Object a = new GrapgQLSampleController()
                                                                                                       .greeting2();
                                                                                    return a;
                                                                                
                                                                            )
                                                                            .build())
                                                 .build();


        GraphQLSchema schema = GraphQLSchema.newSchema().query(queryType).build();
        Map<String, Object> result = (Map<String, Object>) new GraphQL(schema).execute("TestPojo id,name")
                                                                              .getData();
        System.out.println(result);
        // Prints: TestPojo=id=null, name=null
    

    /**
     * service method 2
     *
     * @return
     */
    public TestPojo greeting2() 
        return new TestPojo("1", "Jack");
    

    // inner pojo
    class TestPojo 
        public String id;
        public String name;

        TestPojo(String id, String name) 
            this.id = id;
            this.name = name;
        
    

【问题讨论】:

【参考方案1】:

尝试通过修复代码来进行教学。请注意,静态内容来自 .staticValue("X")

    GraphQLObjectType testPojo = newObject().name("TestPojo")
                                            .description("This is a test POJO")
                                            .field(newFieldDefinition().type(GraphQLString).name("id").staticValue("Test1"))
                                            .field(newFieldDefinition().type(GraphQLString).name("name").staticValue("pojo1"))
                                            .build();

    GraphQLSchema schema = GraphQLSchema.newSchema().query(testPojo).build();
    Map<String, Object> result = (Map<String, Object>) new GraphQL(schema).execute("id,name")
                                                                          .getData();
    System.out.println(result);

将打印 id=Test1, name=pojo1

我有时间可以使用 DataFetcher 更新示例

【讨论】:

这个答案没有回答问题【参考方案2】:

尝试在 TestPojo 类上添加 getter 方法,因为在类上声明时会调用这些方法。否则请在字段中定义您自己的DataFetcher

class TestPojo 
    public final String id;
    public final String name;

    TestPojo(String id, String name) 
        this.id = id;
        this.name = name;
    

    String getId() 
        return id; 
    

    String getName()  
        return name;
    

【讨论】:

以上是关于使用 GraphQLObjectType 的世界你好的主要内容,如果未能解决你的问题,请参考以下文章

GraphQL buildSchema 与 GraphQLObjectType

graphql:使用 GraphQLObjectType 创建扩展 Mutation 的类型

无法使用来自另一个模块或领域的 GraphQLObjectType \"Query\"

为啥自定义子查询类型不能分配给 GraphQLObjectType?

来自 GraphQLObjectType 模式的 graphql mergeSchemas

GraphQL 解析 GraphQLObjectType