喷雾编组 cats.data.Xor
spray marshalling cats.data.Xor
我正在使用 spray 编写 REST api,并且在 json 编组方面遇到了一些困难。我的服务 returns cats.data.Xor[失败,成功]。我如何从 REST 端点 return 这种数据类型?如何为此编写响应编组器?
最简单的解决方案就是在路由器中的值上调用 toEither
,这让 Spray 提供的 Either
编组器接管。
另一种解决方案是提供您自己的编组器(我自己已经做过几次):
import cats.data.Xor
import spray.httpx.marshalling.ToResponseMarshaller
implicit def xorMarshaller[A, B](implicit
ma: ToResponseMarshaller[A],
mb: ToResponseMarshaller[B]
): ToResponseMarshaller[Xor[A, B]] =
ToResponseMarshaller[Xor[A, B]] { (value, ctx) =>
value match {
case Xor.Left(a) => ma(a, ctx)
case Xor.Right(b) => mb(b, ctx)
}
}
这可以让您避免转换的运行时成本(可能可以忽略不计)和句法成本(可以忽略不计)。
请注意,Cats 将在即将发布的版本中删除 Xor
以支持标准库的 Either
,因此目前仅使用 toEither
可能是最实用的解决方案。
我正在使用 spray 编写 REST api,并且在 json 编组方面遇到了一些困难。我的服务 returns cats.data.Xor[失败,成功]。我如何从 REST 端点 return 这种数据类型?如何为此编写响应编组器?
最简单的解决方案就是在路由器中的值上调用 toEither
,这让 Spray 提供的 Either
编组器接管。
另一种解决方案是提供您自己的编组器(我自己已经做过几次):
import cats.data.Xor
import spray.httpx.marshalling.ToResponseMarshaller
implicit def xorMarshaller[A, B](implicit
ma: ToResponseMarshaller[A],
mb: ToResponseMarshaller[B]
): ToResponseMarshaller[Xor[A, B]] =
ToResponseMarshaller[Xor[A, B]] { (value, ctx) =>
value match {
case Xor.Left(a) => ma(a, ctx)
case Xor.Right(b) => mb(b, ctx)
}
}
这可以让您避免转换的运行时成本(可能可以忽略不计)和句法成本(可以忽略不计)。
请注意,Cats 将在即将发布的版本中删除 Xor
以支持标准库的 Either
,因此目前仅使用 toEither
可能是最实用的解决方案。