You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Sangria中实现GraphQL枚举与Scala类型映射及取值?

解决方案

1. 定义GraphQL枚举与Scala Bar类型的映射

你需要调整EnumType的EnumValue配置,直接将value参数设置为对应的Bar实例,让Sangria建立起GraphQL枚举值和Scala类型的关联:

// 调整后的枚举类型,直接绑定Bar实例
implicit val FooEnumFieldType = EnumType(
  "FooEnumFieldType",
  Some("优先级枚举类型描述"),
  List(
    EnumValue("high", value = Bar("high")),
    EnumValue("medium", value = Bar("medium")),
    EnumValue("low", value = Bar("low"))
  )
)

这样配置后,Sangria会自动完成双向转换:输出时把Bar实例映射为对应的GraphQL枚举值;输入时把客户端传入的枚举值转换为Bar实例。

2. 在resolve函数中处理值

输出场景(查询返回数据)

你的FooType是查询用的输出类型,调整枚举类型后,直接返回Foo实例中的option_enum_vector_field即可,类型不匹配问题会自动解决:

val FooType = ObjectType(
  "FooType",
  "Foo对象类型描述",
  fields[Unit, Foo](
    Field(
      name = "option_enum_vector_field",
      fieldType = OptionType(ListType(FooEnumFieldType)),
      resolve = ctx => ctx.value.option_enum_vector_field
    )
  )
)

输入场景(接收客户端传入值)

如果是在Mutation中接收客户端传入的枚举数组,需要定义输入类型并完成转换:

  1. 定义枚举输入类型:
val FooEnumInputType = EnumInputType(FooEnumFieldType)
  1. 定义输入对象类型:
val FooInputType = InputObjectType(
  "FooInputType",
  "Foo输入对象描述",
  List(
    InputField(
      name = "option_enum_vector_field",
      fieldType = OptionInputType(ListInputType(FooEnumInputType))
    )
  )
)
  1. 实现FromInput隐式实例,将输入值转换为Foo:
implicit val fooFromInput: FromInput[Foo] = new FromInput[Foo] {
  override def fromResult(result: MapResult): Foo = {
    val enumValues = result.getOpt[Vector[Bar]]("option_enum_vector_field")
    Foo(enumValues)
  }
}
  1. 在Mutation的resolve中获取转换后的值:
val mutationType = ObjectType(
  "Mutation",
  fields[Unit, Unit](
    Field(
      name = "createFoo",
      fieldType = FooType,
      arguments = Argument("input", FooInputType) :: Nil,
      resolve = ctx => {
        // 直接获取转换后的Foo实例
        val input = ctx.arg[Foo]("input")
        // 执行业务逻辑并返回结果
        input
      }
    )
  )
)

内容的提问来源于stack exchange,提问作者KugisMugis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 09:40:47