我很好奇是否可以将案例类的字段定义为延迟,同时仍然使用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
宏(并手动定义Dashboard
的ObjectType
),那么我将失去宏的好处(更少的样板)。
因此,我很好奇是否有更好的方法或其他方法可以解决此问题,而不是在不使用宏的情况下定义DashboardType
或从Dashboard
案例类中删除tags
字段。
(我希望可能有某种@GraphQLDeferred
注释可以应用于Dashboard.tabs
字段或类似的东西???)
你几乎做对了。您需要使用ReplaceField
而不是AddFields
。或者,您可以ExcludeFields("tabs")
并继续使用AddFields
。