1

プロジェクトで GraphQL Java ライブラリを使用しており、カスタム DataFetcher で目的の結果を返そうとしています。応答オブジェクトを正確に構築するにはどうすればよいですか? 私の知る限り、応答文字列をこの形式で記述するだけではありません。要求されたフィールドに値を割り当てるためのより良い方法があるはずです。

public Object get(DataFetchingEnvironment environment) {
    Integer id = environment.getArgument("id");
    //Process information and get results

    //What should the return object be?                             
    return result;
}
4

1 に答える 1

2

からの戻り値get()は、その特定の操作を評価した結果であるオブジェクトでなければなりません。

たとえば、次のようになります。

  private static GraphQLFieldDefinition allTodoes=
    GraphQLFieldDefinition
      .newFieldDefinition()
      .name("allTodoes")
      .type(new GraphQLList(todo))
      .argument(skip)
      .argument(take)
      .dataFetcher(fetcher)
      .build();

次に、 forが何であれ、コントラクトを満たすオブジェクトのfetcherを返す必要があります。ListGraphQLObjectTypetodo

私の場合、この schemaArrayListをレプリケートしているので、オブジェクトの を返すことができToDoます:

  private static class ToDo {
    public int id;
    public String text;
    public boolean complete;

    ToDo(int id, String text, boolean complete) {
      this.id=id;
      this.text=text;
      this.complete=complete;
    }
  }

Java スタイルのスキーマ全体を次に示します。

/***
 Copyright (c) 2016 CommonsWare, LLC

 Licensed under the Apache License, Version 2.0 (the "License"); you may
 not use this file except in compliance with the License. You may obtain
 a copy of the License at http://www.apache.org/licenses/LICENSE-2.0

 Unless required by applicable law or agreed to in writing, software
 distributed under the License is distributed on an "AS IS" BASIS,
 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
 */

package com.commonsware.agql.client.local;

import android.util.Log;
import java.util.ArrayList;
import java.util.List;
import graphql.Scalars;
import graphql.schema.DataFetcher;
import graphql.schema.DataFetchingEnvironment;
import graphql.schema.GraphQLArgument;
import graphql.schema.GraphQLFieldDefinition;
import graphql.schema.GraphQLList;
import graphql.schema.GraphQLObjectType;
import graphql.schema.GraphQLSchema;

// schema inspired by https://gist.github.com/gsans/d857b0951077bdbbabd968e0431d97fe

public class TestSchema {
  private static class ToDo {
    public int id;
    public String text;
    public boolean complete;

    ToDo(int id, String text, boolean complete) {
      this.id=id;
      this.text=text;
      this.complete=complete;
    }
  }

  private static ArrayList<ToDo> TODOES=new ArrayList<>();

  static {
    TODOES.add(new ToDo(123, "get this sample working", false));
    TODOES.add(new ToDo(4567, "add more test cases", false));
    TODOES.add(new ToDo(89012, "add more documentation", false));
    TODOES.add(new ToDo(345678, "add more todoes", false));
  }

  private static GraphQLFieldDefinition id=
    GraphQLFieldDefinition
      .newFieldDefinition()
      .name("id")
      .description("unique identifier")
      .type(Scalars.GraphQLInt)
      .build();

  private static GraphQLFieldDefinition text=
    GraphQLFieldDefinition
      .newFieldDefinition()
      .name("text")
      .description("what is to be done")
      .type(Scalars.GraphQLString)
      .build();

  private static GraphQLFieldDefinition complete=
    GraphQLFieldDefinition
      .newFieldDefinition()
      .name("complete")
      .description("are we done yet?")
      .type(Scalars.GraphQLBoolean)
      .build();

  private static GraphQLObjectType todo=
    GraphQLObjectType.newObject()
      .name("Todo")
      .description("Something to be done")
      .field(id)
      .field(text)
      .field(complete)
      .build();

  private static GraphQLArgument skip=
    GraphQLArgument
      .newArgument()
      .name("skip")
      .description("return starting with this index")
      .type(Scalars.GraphQLInt)
      .build();

  private static GraphQLArgument take=
    GraphQLArgument
      .newArgument()
      .name("take")
      .description("return this number of todoes")
      .type(Scalars.GraphQLInt)
      .build();

  private static DataFetcher fetcher=new DataFetcher() {
    @Override
    public Object get(DataFetchingEnvironment env) {
      int startIndex=0;
      int endIndex=TODOES.size()-1;
      List<ToDo> result=null;

      try {
        if (env.containsArgument("skip")) {
          Integer skip=env.getArgument("skip");

          if (skip!=null) {
            startIndex=skip.intValue();
          }
        }

        if (env.containsArgument("take")) {
          Integer take=env.getArgument("take");

          if (take!=null) {
            endIndex=startIndex+take;
          }
        }

        result=TODOES.subList(startIndex, endIndex);
      }
      catch (Exception e) {
        Log.e(getClass().getSimpleName(), "Exception processing request", e);
        // um, how do I get this error into result?
      }

      return(result);
    }
  };

  private static GraphQLFieldDefinition allTodoes=
    GraphQLFieldDefinition
      .newFieldDefinition()
      .name("allTodoes")
      .type(new GraphQLList(todo))
      .argument(skip)
      .argument(take)
      .dataFetcher(fetcher)
      .build();

  private static GraphQLObjectType rootQuery=
    GraphQLObjectType
      .newObject()
      .name("rootQuery")
      .field(allTodoes)
      .build();

  public static GraphQLSchema schema=
    GraphQLSchema.newSchema().query(rootQuery).build();
}

a のデフォルトでは、DataFetcherゲッターまたはpublicフィールドを使用して値を解決しますが、ライブラリには別の IIRC を実行するオプションがあります。

1つのコメントからわかるように、エラーを処理する方法を理解することはできませんでしたが、そのためのオプションがあると確信しています。

于 2016-10-21T12:55:29.597 に答える