2016-12-31 19 views
14

我想要写一段代码,它将处理GraphQL查询,像这样:为什么在此GraphQL设置中不调用DataFetcher?

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方法,断点不激活d。

为什么?我该如何解决它?

回答

5

这是你的工作示例我可以使用查询。 我在发布它时使用了您的查询文件。 进一步根据需要实现您的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(); 
    } 
} 
0

你的问题是你的查询。如果你调试变量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")}

+0

无论 –

+0

\ n是简单的空白,它都与'\ n'一起工作。这是一条新的路线。 –

相关问题