带有 EitherT 结果的 Sangria GraphQL Schema
Sangria GraphQL Schema with EitherT result
我正在将 Sangria 用于 Play 应用程序,目前正在努力实现架构定义。问题是,该服务不直接 return 需要的对象,它 return 是一个包含该对象的 EitherT。
这里有一些代码示例
案例class
case class User(name: String, age: Int)
用户服务
def user(): EitherT[Future, AbstractError, User] = {...}
如果服务 return 是 User
而不是 EitherT[Future, AbstractError, User]
我会像这样导出架构:
架构
val UserType = deriveObjectType[UserService, User](
ObjectTypeName("User"),
ObjectTypeDescription("A simple user."))
我是否必须实现一个额外的层来从 EitherT
对象中提取 User
或者是否有其他方法来处理这种情况?
您仍然可以导出 User
对象类型,因为它只是一个简单的案例 class。对于加载用户和 return EitherT
的其他 GraphQL 字段,您需要将值转换为 sangria 可以使用的值(这意味着这些字段需要手动定义,但您仍然可以使用derive*
其他字段的宏)。最简单的方法是将它折叠成一个简单的 Future[User]
。 Future
能够保持错误或成功结果。如果您在 Either
中有一个错误列表,那么您可以将它包装在一些自定义异常中,然后解包并在 ExceptionHandler
.
中正确呈现它
您还可以在架构中的某处使用从猫 EitherT
到桑格利亚汽酒 FutureValue
的隐式转换:
implicit def eithertAction[Ctx, Val, E <: Throwable](value: EitherT[Future, E, Val]): ReduceAction[Ctx, Val] = FutureValue(value.valueOrF(Future.failed))
我正在将 Sangria 用于 Play 应用程序,目前正在努力实现架构定义。问题是,该服务不直接 return 需要的对象,它 return 是一个包含该对象的 EitherT。
这里有一些代码示例
案例class
case class User(name: String, age: Int)
用户服务
def user(): EitherT[Future, AbstractError, User] = {...}
如果服务 return 是 User
而不是 EitherT[Future, AbstractError, User]
我会像这样导出架构:
架构
val UserType = deriveObjectType[UserService, User](
ObjectTypeName("User"),
ObjectTypeDescription("A simple user."))
我是否必须实现一个额外的层来从 EitherT
对象中提取 User
或者是否有其他方法来处理这种情况?
您仍然可以导出 User
对象类型,因为它只是一个简单的案例 class。对于加载用户和 return EitherT
的其他 GraphQL 字段,您需要将值转换为 sangria 可以使用的值(这意味着这些字段需要手动定义,但您仍然可以使用derive*
其他字段的宏)。最简单的方法是将它折叠成一个简单的 Future[User]
。 Future
能够保持错误或成功结果。如果您在 Either
中有一个错误列表,那么您可以将它包装在一些自定义异常中,然后解包并在 ExceptionHandler
.
您还可以在架构中的某处使用从猫 EitherT
到桑格利亚汽酒 FutureValue
的隐式转换:
implicit def eithertAction[Ctx, Val, E <: Throwable](value: EitherT[Future, E, Val]): ReduceAction[Ctx, Val] = FutureValue(value.valueOrF(Future.failed))