如何在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中接收客户端传入的枚举数组,需要定义输入类型并完成转换:
- 定义枚举输入类型:
val FooEnumInputType = EnumInputType(FooEnumFieldType)
- 定义输入对象类型:
val FooInputType = InputObjectType( "FooInputType", "Foo输入对象描述", List( InputField( name = "option_enum_vector_field", fieldType = OptionInputType(ListInputType(FooEnumInputType)) ) ) )
- 实现
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) } }
- 在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
相关产品推荐
相关产品推荐

