Sangria GraphQL:如何混合递延字段、派生对象类型和案例类



我很好奇是否可以将案例类的字段定义为延迟,同时仍然使用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宏(如果可能的话)。因此,以下是我如何定义我的ObjectType

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案例类中删除tabs字段,错误就会消失,但我失去了使用案例类的一些好处(尤其是在单元测试中)。如果我避免使用deriveObjectType宏(并手动定义DashboardObjectType),那么我将失去宏的好处(更少的样板)。

因此,我很好奇是否有更好的方法或其他方法可以解决此问题,而不是在不使用宏的情况下定义DashboardType或从Dashboard案例类中删除tags字段。

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

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

最新更新