【发布时间】:2018-03-15 03:08:25
【问题描述】:
我有一个Inventory的案例类:
case class Inventory(
organizationId: UUID,
inventoryId: UUID,
name: String,
schema: String
)
输入类型:
private val NewInventoryInputType =
deriveInputObjectType[Inventory](
InputObjectTypeName("NewInventory"),
ExcludeInputFields("organizationId", "inventoryId")
)
一个论点:
val NewInventory = Argument("inventory", NewInventoryInputType)
最后是一个字段:
val MutationType = ObjectType("Mutation", fields[GraphQLContext, Unit](
Field("createInventory", OptionType(UuidType),
Some("Creates a new inventory."),
NewInventory :: Nil,
resolve = c => {
val inventoryId = UUID.randomUUID
val inventory = c arg NewInventory
println(s"Inventory($inventory)")
inventoryId
}
)
))
我想做的是能够创建一个 Inventory 并使用如下查询:
{
"query": "mutation ($inventory: NewInventory!) { createInventory(inventory: $inventory) }",
"variables": {
"inventory": {
"name":"i1",
"schema":"s"
}
}
}
缺少的部分是在 Sangria 尝试使用其拥有的变量实例化 Inventory 域对象之前为 organizationId 和 inventoryId 创建 UUID。
目前,我收到此错误:
Argument 'inventory' has invalid value: At path '/inventoryId': error.path.missing (line 1, column 67):
mutation ($inventory: NewInventory!) { createInventory(inventory: $inventory) }
^
(当然,我可以只创建一个没有 ID 字段的 NewInventory 案例类并手动实例化一个 Inventory,但我想避免为每个实体类型创建和维护两个类。)
【问题讨论】:
-
在我的 Sangria 代码库中,我不使用任何
deriveInputObjectType,因为我不喜欢在我的 Sangria 类型和域模型之间进行一对一的耦合。我有一些情况,一个突变可能会创建 3,4 或 5 个域模型,其中一些被放入数据库等。另一个原因正是这种情况,你有一个ID字段而不是另一个。 -
@Tyler 你会做什么呢?将字段作为单独的参数传递?
-
是的,我的每个突变都有单独的参数,而不仅仅是“对象”的一个参数