Я пытаюсь разработать весенний загрузочный сервис 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
}
}