我是否必须重写桑格利亚模式中的每个案例类才能在graphQL中公开?
想象一下,我把这个作为我的模式,人们用鸟ID进行查询,如果他们询问位置,他们会得到有关位置的所有信息。我还需要以“模式”格式定义位置吗?或者有没有办法立即在这里使用案例类?我是否必须重写桑格利亚模式中的每个案例类才能在graphQL中公开?
如果您想了解一下我为什么要这样做的背景: 我得到了一个JSon模式,它是大规模嵌套的,它几乎不可能管理它的每个级别。我对用户请求顶层元素感到满意,该元素将返回该阶段定义的任何案例类。
import sangria.schema._ case class Location(lat: String, long: String)
case class Bird(name: String, location: List[Location])
class BirdRepo {
def get(id: Int) = {
if(id < 10) {
Bird("Small",
List(Location("1", "2"), Location("3", "4")
))
} else {
Bird("Big",
List(Location("5", "6"), Location("7", "8")
))
}
}
}
object SchemaDefinition {
val Bird = ObjectType(
"Bird",
"Some Bird",
fields[BirdRepo, Bird] (
Field("name", StringType, resolve = _.value.name),
Field("location", List[Location], resolve = _.value.location)
// ^^ I know this is not possible
)
)
}
回答:
从文档,你应该检查出ObjectType Derivation
这里部分是例如:
case class User(id: String, permissions: List[String], password: String) val UserType = deriveObjectType[MyCtx, User](
ObjectTypeName("AuthUser"),
ObjectTypeDescription("A user of the system."),
RenameField("id", "identifier"),
DocumentField("permissions", "User permissions",
deprecationReason = Some("Will not be exposed in future")),
ExcludeFields("password"))
你会发现,你仍然需要提供姓名,再有是一些可选的东西,如字段和折旧的重命名。
它会生成一个对象类型,相当于这一个:
ObjectType("AuthUser", "A user of the system.", fields[MyCtx, User]( Field("identifier", StringType, resolve = _.value.id),
Field("permissions", ListType(StringType),
description = Some("User permissions"),
deprecationReason = Some("Will not be exposed in future"),
resolve = _.value.permissions)))
回答:
正如@Tyler提到的,你可以使用deriveObjectType
。这两种类型的定义如下所示:
implicit val LocationType = deriveObjectType[BirdRepo, Location]() implicit val BirdType = deriveObjectType[BirdRepo, Bird]()
deriveObjectType
能够正确处理List[Location]
只要你(你的情况LocationType
)的范围内定义的ObjectType[BirdRepo, Location]
的隐含实例。
场( “位置”,列表[位置],解决= _.value.location)
正确的语法是:
Field("location", ListType(LocationType), resolve = _.value.location)
假定您已经定义LocationType
其他地方。
以上是 我是否必须重写桑格利亚模式中的每个案例类才能在graphQL中公开? 的全部内容, 来源链接: utcz.com/qa/257337.html