我是否必须重写桑格利亚模式中的每个案例类才能在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

回到顶部