Как мне разрешить данные для типа схемы, которые реализуют интерфейс в GraphQL? - PullRequest
0 голосов
/ 09 мая 2018

Я пытаюсь разработать весенний загрузочный сервис graphQl, используя библиотеку graphql-java-8. Я получаю данные из веб-службы, ответ, который я получаю от службы, немного похож на динамический, для которого мне нужно ввести интерфейс graphQl в мою схему graphQl ответа.

extend type Query {
    search(
        name: String,
        category: String
    ): [ResultOne]
}

interface ResultOne {
    name: String
    content: String
}

type Fish implements ResultOne {
    name: String
    content: String
    weight: Float
}

type Fruit implements ResultOne {
    name: String
    content: String
    Color: String
}

type Toy implements ResultOne {
    name: String
    content: String
    description: String
}

Для подключения моей модели с каркасом graphQl,

return RuntimeWiring.newRuntimeWiring()
    .wiringFactory(new WiringFactory() {})
    .type(
          TypeRuntimeWiring.newTypeWiring("ResultOne")
          .typeResolver(env -> {
              if(env.getObject() instanceof Map) {
              Map object = env.getObject();
              if (object.containsKey("name") && object.get("name").equals("fish")) {
                return (GraphQLObjectType) env.getSchema().getType("Fish");
              } else if (object.containsKey("name") && object.get("name").equals("fruit")) {
                return (GraphQLObjectType) env.getSchema().getType("Fruit");            
              } else if(object.containsKey("name") && object.get("name").equals("toy")) {
                return (GraphQLObjectType) env.getSchema().getType("Toy");  
              } else {
                return null;
              }
          } else {
             return null;
          }
      })
  )
  .build();

Итак, проблема с разрешением типов - это тоже способ исправить, не уверен, что он идеален или нет. Что касается привязки данных, я не уверен, как мне это сделать рекомендованным способом GraphQl. Я хотел бы добавить, что у меня есть одна конечная точка и один сборщик для всего API. Данные выбираются в одном запросе, и я не хочу звонить дважды, поскольку у меня уже есть полный ответ Мне пришлось разрешить тип во время выполнения и связать данные для реализованной модели. Пока данные извлекаются идеально, и значения также поступают в интерфейс по моему запросу, но для части модели, реализованной в интерфейсе, например, в этом примере, это Fish, Fruit & Toy. У меня вопрос, как мне манипулировать динамически разрешенными типами данных для библиотеки Java?

Не стесняйтесь задавать мне любые вопросы по этому вопросу.

Пример запроса:

{
  search() {
    ResultOne {
      name
      content
      ... on Fish {
        weight  
      }
    }
  }
}

Соответствующий ответ, который я сейчас получаю:

{
  "data": {
    "search": [
     {  
     "resultOne": [
          {
            "name": "Salmon", 
            "content": "Frozen Food",
            "weight": null
          }
        ]
      }
    ]
  },
  "extensions": {
    "Total-ResponseTime": 23020,
    "resultOne-Time": 22683
  }
}
...