Как должно выглядеть определение схемы graphql для класса Page? - PullRequest
0 голосов
/ 26 ноября 2018

поэтому у меня есть этот класс в kotlin:

@Component
class UserResolver @Autowired
constructor(private val userService: UserService): GraphQLMutationResolver, GraphQLQueryResolver {

    fun createUser(user: User): User {
        userService.save(user)
        return user
    }

    fun users(): Page<User> {
        val pageable = QPageRequest(0, 10)

        return userService.all(pageable)
    }
}

Я хочу, чтобы пользователи метода возвращали объект Page, я совершенно новичок в graphql.Я пробовал что-то вроде этого:

type Page {
    number: Int
    size: Int
    numberOfElements: Int
    content: []
    hasContent: Boolean
    isFirst: Boolean
    isLast: Boolean
    hasNext: Boolean
    hasPrevoius: Boolean
    totalPages: Int
    totalElements: Float
}

, но мое приложение весенней загрузки не запускается, я не представляю, как должно выглядеть определение моей схемы для этого класса https://docs.spring.io/spring-data/commons/docs/current/api/org/springframework/data/domain/Page.html.У кого-нибудь есть идея?

Редактировать : ошибка:

Не удалось создать экземпляр объекта с помощью фабричного метода;вложенным исключением является org.springframework.beans.BeanInstantiationException: не удалось создать экземпляр [com.coxautodev.graphql.tools.SchemaParser]: метод фабрики 'schemaParser' вызвал исключение;вложенное исключение - com.coxautodev.graphql.tools.TypeClassMatcher $ RawClassRequiredForGraphQLMappingException: тип org.springframework.data.domain.Pageне может быть сопоставлен с типом GraphQL!Поскольку GraphQL-Java имеет дело со стертыми типами во время выполнения, только непараметризованные классы могут представлять тип GraphQL.Это позволяет осуществлять обратный поиск по классу Java в интерфейсах и типах объединения.

1 Ответ

0 голосов
/ 05 декабря 2018

Обработка дженериков немного изменилась с помощью 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
}
...