Page 类的 graphql 模式定义应该是啥样的?

Posted

技术标签:

【中文标题】Page 类的 graphql 模式定义应该是啥样的?【英文标题】:What should graphql schema definition for Page class looks like?Page 类的 graphql 模式定义应该是什么样的? 【发布时间】:2019-04-27 14:17:53 【问题描述】:

所以我在 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

但是我的 Spring Boot 应用程序无法启动,我不知道我的此类 https://docs.spring.io/spring-data/commons/docs/current/api/org/springframework/data/domain/Page.html 的架构定义应该是什么样子。有人有想法吗?

编辑:错误是:

通过工厂方法实例化 Bean 失败;嵌套异常是 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进行反向查找 接口和联合类型中的类。

【问题讨论】:

你能分享日志中的错误输出吗? @pipo_dev 已编辑 【参考方案1】:

在过去几个月中,GraphQL Java 工具对泛型的处理发生了一些变化。你用的是什么版本?我刚刚在 5.4.1 版本中尝试过,它似乎可以工作,但在 5.2.4 版本中却没有。我想知道this 问题的修复是否可能相关。

如果有帮助,这是我使用的测试内容:

首先,我声明了一个这样的类:class Page&lt;T&gt;(val number: Int, val size: Int)

其次,在解析器中我有fun users() = Page&lt;User&gt;(...)

第三,在 GraphQL 架构文件中我有这个

type Page 
    number: Int
    size: Int!


type Query 
    users: Page

上述限制是您在 GraphQL 模式中只有一个类型,简称为 Page。但是大概你想要一些关于 User 对象的特定信息?在您的示例中,这是否意味着在 content 属性中?如果是这样,我认为您需要在 GraphQL 模式中为您可能传递给Page 的泛型类型参数的每种类型声明一个单独的类型,例如UserPageCustomerPage 等。然后在代码中,每个都需要映射到正确的 Kotlin 类,例如Page&lt;User&gt;Page&lt;Customer&gt;。如果没有每个泛型的具体实现,我不知道如何在代码中做到这一点(希望其他人可以解释如何做到这一点)。如果 GraphQL 类型名称具有相同的名称,或者在使用 SchemaParser.newParser().dictionary(... 构建 Schema 时使用显式提供的映射,则默认情况下 GraphQL 类型名称与 Kotlin 类名称结合使用

因此,如果您乐于为您提供给它的每种类型创建泛型类的具体子类,您可以执行以下操作:

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

【讨论】:

是的,谢谢,将 graphql java 工具升级到 5.4.1 并将 kotlin 升级到 1.3.0 是必要的

以上是关于Page 类的 graphql 模式定义应该是啥样的?的主要内容,如果未能解决你的问题,请参考以下文章

对象对象的 GraphQL 模式/解析器是啥样的?

在 graphql-yoga 中返回枚举的解析器函数是啥样的?

layui在加载时,从后台返回的Json数据应该是啥样的数据

请问在Unity的像素Shader里返回的颜色的计算模式是啥样的?

API Gateway 中 AWS Firehose PutRecordBatch 的映射模板应该是啥样的?

我的 json 应该是啥样的?使用 Web 套接字发送消息