Подтвердить что ты не робот

Почему DataFetcher не вызывается в этой настройке GraphQL?

Я хочу написать фрагмент кода, который будет обрабатывать запросы 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 в режиме отладки, точка останова не активируется.

Почему? Как я могу это исправить?

4b9b3361

Ответ 1

Вот ваш рабочий образец. Я использовал ваш файл запроса, когда вы его разместили. Внесите свой 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();
    }
}

Ответ 2

Ваша проблема заключается в вашем запросе. Если вы отлаживаете переменную 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")}