GraphQL динамически разрешает несколько схем

Я разрабатываю сервис graphql, используя зависимости [com.graphql-java: graphql-java: 8.0]. По сути, мне нужно получить некоторые условные данные на основе ответа родительской схемы. например, если ResultOne ответ contentTypeId == 1, для которого мне нужно получить и подготовить дополнительный ответ с использованием схемы типа Fish, соответственно для contentTypeId == 2, мне нужно получить и подготовить ответ, используя схему типа Fruit.

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

type ResultOne {
    contentTypeId: Int
    content: Content
}

type Fish {
    name: String    
    weight: Float
}

type Fruit {
    name: String
    Color: String
}

type Toy {
    name: String
    description: String
}

Я устал от объединения, но в этом случае возникло исключение: «Не определен преобразователь типов для интерфейса / объединения типа Content».

union Content = Fish | Fruit |Toy

Пожалуйста, не стесняйтесь задать мне свой вопрос, если моя проблема не ясна.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
1 261
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это можно сделать с помощью Unions - вы близки, и ошибка весьма полезна - «Для интерфейса / типа объединения 'Content' не определен преобразователь типов» - это означает, что вам нужно написать этот преобразователь контента, который будет соответствовать правильному типу для contentTypeId. Я не могу вам здесь помочь, так как пишу свои API-интерфейсы GrapQL с помощью Node.js.

Но я бы предложил использовать здесь интерфейс. Если у вас есть интерфейс с возможностью поиска, вы можете легко написать такую ​​схему:

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

interface Searchable {
    contentTypeId: Int
    name: String
}

type Fish implements Searchable {
    contentTypeId: Int
    name: String    
    weight: Float
}

type Fruit implements Searchable {
    contentTypeId: Int
    name: String
    Color: String
}

type Toy implements Searchable {
    contentTypeId: Int
    name: String
    description: String
}

Вот хорошее объяснение того, когда использовать интерфейсы и союзы:

https://medium.com/the-graphqlhub/graphql-tour-interfaces-and-unions-7dd5be35de0d

Другие вопросы по теме