Обработка дженериков немного изменилась с помощью GraphQL Java Tools за последние несколько месяцев.Какую версию ты используешь?Я только попробовал это с версией 5.4.1, и это, казалось, работало, хотя с 5.2.4 это не делало.Интересно, может ли это быть связано с этой проблемой.
В случае, если это поможет, вот тестовый материал, который я использовал:
Во-первых, я объявил такой класс: class Page<T>(val number: Int, val size: Int)
Во-вторых, в резольвере у меня было fun users() = Page<User>(...)
В-третьих, в файле схемы GraphQL у меня было это
type Page {
number: Int
size: Int!
}
type Query {
users: Page
}
Ограничение приведенным вышев том, что у вас есть единственный тип в схеме GraphQL, просто называемый Page
.Но, по-видимому, вы хотите что-то конкретное о User
объектах?Это подразумевается в свойстве content
в вашем примере?Если это так, я думаю, вам нужно объявить отдельный тип в схеме GraphQL для каждого типа, который вы можете передать в параметр универсального типа Page
, например, UserPage
, CustomerPage
и т. Д. Затем в коде каждый изони должны быть сопоставлены с правильным классом Kotlin, например, Page<User>
, Page<Customer>
.Я не знаю способа сделать это в коде, не имея конкретной реализации каждого из обобщений (надеюсь, если это возможно, кто-то другой может объяснить, как это сделать).Имена типов GraphQL по умолчанию объединяются с именами классов Kotlin, если они имеют одно и то же имя, или используют явно предоставленное отображение при построении Schema
с использованием SchemaParser.newParser().dictionary(...
Так что если вы счастливы создаватьконкретные подклассы универсального класса для каждого типа, который вы ему предоставляете, вы можете сделать что-то вроде этого:
open class Page<T>(val number: Int, val size: Int, val content: List<T>)
class UserPage(number: Int, size: Int, content: List<User>): Page<User>(number, size, content)
fun users(): UserPage {...
И в схеме GraphQL у вас будет это:
type UserPage {
number: Int!
size: Int!
content: [User]!
}
type Query {
users: UserPage
}