Sangria GraphQL:如何混合延迟字段、deriveObjectType 和大小写 类

Sangria GraphQL: How to mix deferred fields, deriveObjectType, and case classes

我很好奇是否可以将案例 class 的字段定义为延迟,同时仍然使用 deriveObjectType 宏来定义其他所有内容。

这是一个例子。仪表板包含一系列选项卡:

case class Tab(id: Long, dashboardId: Long, name: String, order: Long)

case class Dashboard(id: Long, name: String, tabs: Seq[Tab])

我正在使用 Fetcher 推迟对 Dashboard.tabs 字段的解析,并且我想继续使用 deriveObjectType 宏(如果可能)。所以这就是我如何定义我的 ObjectTypes:

val TabType = deriveObjectType[Unit, Dashboard]()

val DashboardType = deriveObjectType[Unit, Dashboard](
  AddFields(
    fields =
      Field(
        name = "tabs",
        fieldType = ListType(TabType),
        resolve = ctx => {
          TabsFetcher.fetcher.defer(ctx.value.id)
        }
      )
  )
)

但是,当我 运行 代码时,出现以下错误:

sangria.schema.NonUniqueFieldsError: All fields within 'Dashboard' type should have unique names! Non-unique fields: 'tabs'.

如果我从 Dashboard 案例 class 中删除 tabs 字段,错误就会消失,但我会失去使用案例 class 的一些好处(特别是在单元测试中)。如果我避免使用 deriveObjectType 宏(并手动定义 DashboardObjectType),那么我将失去宏的好处(更少样板)。

所以,我很好奇是否有更好的方法或其他方法来解决这个问题,而不是在不使用宏的情况下定义 DashboardType 或从中删除 tags 字段Dashboard 案例 class.

(我希望可能有某种 @GraphQLDeferred 注释可以应用到 Dashboard.tabs 字段或类似的东西???)

你几乎做对了。您需要使用 ReplaceField 而不是 AddFields。或者,您可以 ExcludeFields("tabs") 并继续使用 AddFields