【问题标题】:Why is DataFetcher not called in this GraphQL setup?为什么在这个 GraphQL 设置中没有调用 DataFetcher?
【发布时间】:2017-05-15 10:14:30
【问题描述】:

我想写一段代码,它会处理这样的 GraphQL 查询:

  query {
      group(id: "com.graphql-java")
      name(name: "graphql-java")
      version(id: "2.3.0")
  }

我创建了一个数据获取器并在get 方法中放置了一个断点:

  import graphql.schema.DataFetcher;
  import graphql.schema.DataFetchingEnvironment;

  public class TestDataFetcher implements DataFetcher {
      public Object get(final DataFetchingEnvironment dataFetchingEnvironment) {
          return null;
      }
  }

然后我写了以下代码:

  public class Example02 {
      public static void main(final String[] args) throws IOException {
          final Example02 app = new Example02();
          app.run();
      }
      void run() throws IOException {
          final TestDataFetcher testDataFetcher = new TestDataFetcher();

          final List<GraphQLFieldDefinition> fields = Lists.newArrayList(
                  createGroupField(testDataFetcher),
                  createNameField(),
                  createVersionField());

          final GraphQLObjectType queryType = newObject()
                  .name("query")
                  .fields(fields)
                  .build();
          final GraphQLSchema schema = GraphQLSchema.newSchema()
                  .query(queryType)
                  .build();
          final String query = FileUtils.readFileToString(
                  new File("src/main/resources/query1.txt"),
                  "UTF-8"
          );
          final Map<String, Object> result = (Map<String, Object>) new GraphQL(schema).execute(query).getData();
          System.out.println(result);
      }

      private GraphQLFieldDefinition createVersionField() {
          return newFieldDefinition().type(GraphQLString).name("version").build();
      }

      private GraphQLFieldDefinition createNameField() {
          return newFieldDefinition().type(GraphQLString).name("name").build();
      }

      private GraphQLFieldDefinition createGroupField(TestDataFetcher testDataFetcher) {
          final GraphQLArgument idArg = newArgument().name("id").type(GraphQLString).build();
          return newFieldDefinition()
                  .type(GraphQLString)
                  .name("group")
                  .dataFetcher(testDataFetcher)
                  .argument(idArg)
                  .build();
      }
  }

当我在调试模式下运行main 方法时,断点没有被激活。

为什么?我该如何解决?

【问题讨论】:

    标签: java graphql graphql-java


    【解决方案1】:

    您的问题是您的查询。如果您调试变量query,它是query {\n group(id: "com.graphql-java")\n name(name: "graphql-java")\n version(id: "2.3.0")\n}。 问题是查询中的“\n”。

    如果您将查询更改为query{group(id: "com.graphql-java")},您的断点将被执行。

    要执行您的查询,我必须先更新 GraphQlFiledDefinitions 以接收参数。

    private GraphQLFieldDefinition createVersionField(TestDataFetcher testDataFetcher) {
        final GraphQLArgument idArg = newArgument().name("id").type(GraphQLString).build();
        return newFieldDefinition().type(GraphQLString).name("version").staticValue("id value").argument(idArg).build();
    }
    
    private GraphQLFieldDefinition createNameField(TestDataFetcher testDataFetcher) {
        final GraphQLArgument nameArg = newArgument().name("name").type(GraphQLString).build();
        return newFieldDefinition().type(GraphQLString).name("name").staticValue("name Value").argument(nameArg).build();
    }
    
    private GraphQLFieldDefinition createGroupField(TestDataFetcher testDataFetcher) {
        final GraphQLArgument idArg = newArgument().name("id").type(GraphQLString).build();
        return newFieldDefinition()
                .type(GraphQLString)
                .name("group")
                .dataFetcher(testDataFetcher)
                .argument(idArg)
                .build();
    }
    

    然后我可以使用没有换行符的查询query {group(id: "com.graphql-java"),name(name:"graphql-java"),version(id: "2.3.0")}

    【讨论】:

    • \n 只是空格。这是一条新线路。
    【解决方案2】:

    这是您的工作示例。 我已经使用了您发布的查询文件。 根据需要进一步实施您的 dataFetcher。 基本上你应该已经定义了名称和版本字段的参数。 当你运行 new GraphQL(schema).execute(query) 时,调试器会告诉你一切 它有包含所有问题的errors 数组。

    import graphql.GraphQL;
    import graphql.schema.*;
    import org.apache.commons.io.FileUtils;
    
    import java.io.File;
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Map;
    
    import static graphql.Scalars.GraphQLString;
    import static graphql.schema.GraphQLArgument.newArgument;
    import static graphql.schema.GraphQLFieldDefinition.newFieldDefinition;
    import static graphql.schema.GraphQLObjectType.newObject;
    
    public class Example2 {
    
    
        public class TestDataFetcher implements DataFetcher {
            public Object get(DataFetchingEnvironment environment) {
                String id = (String)environment.getArgument("id");
                return id;
            }
        }
    
        public static void main(final String[] args)  {
            Example2 app = new Example2();
            app.run();
        }
        void run() {
             TestDataFetcher testDataFetcher = new TestDataFetcher();   
    
             List<GraphQLFieldDefinition> fields = new ArrayList<GraphQLFieldDefinition>();
    
                fields.add(createGroupField(testDataFetcher));
                    fields.add(createNameField());
                    fields.add(createVersionField());
    
             GraphQLObjectType queryType = newObject()
                    .name("query")
                    .fields(fields)
                    .build();
    
             GraphQLSchema schema = GraphQLSchema.newSchema()
                    .query(queryType)
                    .build();
            String query = null;
            try {
                  query = FileUtils.readFileToString(
                        new File("src/main/resources/query1.txt"),
                        "UTF-8"
                );
            }catch(IOException ioe){
                ioe.printStackTrace();
            }
    
            if(query!=null) {
                Map<String, Object> result = (Map<String, Object>) new GraphQL(schema).execute(query).getData();
                System.out.println(result);
            }
        }
    
        private GraphQLFieldDefinition createVersionField() {
             GraphQLArgument arg = newArgument().name("id").type(GraphQLString).build();
            return newFieldDefinition().type(GraphQLString).name("version").argument(arg).build();
        }
    
        private GraphQLFieldDefinition createNameField() {
            GraphQLArgument arg = newArgument().name("name").type(GraphQLString).build();
            return newFieldDefinition().type(GraphQLString).name("name").argument(arg).build();
        }
    
        private GraphQLFieldDefinition createGroupField(TestDataFetcher testDataFetcher) {
            final GraphQLArgument idArg = newArgument().name("id").type(GraphQLString).build();
            return newFieldDefinition()
                    .type(GraphQLString)
                    .name("group")
                    .dataFetcher(testDataFetcher)
                    .argument(idArg)
                    .build();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-15
      • 1970-01-01
      • 1970-01-01
      • 2017-06-21
      • 2011-09-24
      • 2017-04-07
      • 2020-02-03
      相关资源
      最近更新 更多