1

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

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

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

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

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

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'.

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

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

(我希望可能有某种@GraphQLDeferred注释可以应用于该Dashboard.tabs领域或类似的东西???)

4

1 回答 1

1

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

于 2018-01-17T12:45:40.757 回答