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
宏(如果可能)。所以这就是我如何定义我的 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'.
如果我从 Dashboard
案例 class 中删除 tabs
字段,错误就会消失,但我会失去使用案例 class 的一些好处(特别是在单元测试中)。如果我避免使用 deriveObjectType
宏(并手动定义 Dashboard
的 ObjectType
),那么我将失去宏的好处(更少样板)。
所以,我很好奇是否有更好的方法或其他方法来解决这个问题,而不是在不使用宏的情况下定义 DashboardType
或从中删除 tags
字段Dashboard
案例 class.
(我希望可能有某种 @GraphQLDeferred
注释可以应用到 Dashboard.tabs
字段或类似的东西???)
你几乎做对了。您需要使用 ReplaceField
而不是 AddFields
。或者,您可以 ExcludeFields("tabs")
并继续使用 AddFields
。
我很好奇是否可以将案例 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
宏(如果可能)。所以这就是我如何定义我的 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'.
如果我从 Dashboard
案例 class 中删除 tabs
字段,错误就会消失,但我会失去使用案例 class 的一些好处(特别是在单元测试中)。如果我避免使用 deriveObjectType
宏(并手动定义 Dashboard
的 ObjectType
),那么我将失去宏的好处(更少样板)。
所以,我很好奇是否有更好的方法或其他方法来解决这个问题,而不是在不使用宏的情况下定义 DashboardType
或从中删除 tags
字段Dashboard
案例 class.
(我希望可能有某种 @GraphQLDeferred
注释可以应用到 Dashboard.tabs
字段或类似的东西???)
你几乎做对了。您需要使用 ReplaceField
而不是 AddFields
。或者,您可以 ExcludeFields("tabs")
并继续使用 AddFields
。