2016-10-21 1 views
1

프로젝트에서 GraphQL Java 라이브러리를 사용하고 있으며 사용자 지정 DataFetcher에서 원하는 결과를 반환하려고합니다. 응답 객체를 정확히 어떻게 구성합니까? 내가 아는 한, 응답 문자열을 형식으로 작성하지는 않습니다. 요청한 필드에 값을 할당하는 더 좋은 방법이 있어야합니다.응답을 반환하기 위해 Java 개체를 GraphQL 개체로 변환

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

    //What should the return object be?        
    return result; 
} 
+0

스택 오버플로에 오신 것을 환영합니다! 귀하의 질문에 대한 자세한 내용은 매우 가볍습니다. 다른 사용자가 당신을 더 잘 도울 수 있도록 [묻는 방법] (http://stackoverflow.com/help/how-to-ask)을 참조하십시오. 행운을 빕니다! – Ortund

답변

2
get()

의 리턴 값은 특정 동작을 평가 한 결과 인 객체가 될 것이다. 주어진 예를 들어

:

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

후 반환해야 fetchertodoGraphQLObjectType 무엇이든의 계약을 만족 객체의 List. 내 경우

, 나는 this schema를 복제하고, 그래서 나는 ArrayList ToDo의 객체를 반환 할 수 있습니다

/*** 
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(); 
} 

기본에 : 여기

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; 
    } 
    } 

전체 스키마, 자바 스타일 DataFetcher은 게터 또는 public 필드를 사용하여 값을 확인하지만 라이브러리에 IIRC를 수행하는 옵션이 있습니다.

한 가지 의견에서 알 수 있듯이 오류를 처리하는 방법을 알아 내려고하지는 않았지만 확실한 옵션이 있습니다.

관련 문제