1

我正在使用喷雾编写 REST api,并且在 json 编组方面遇到了一些困难。我的服务返回cats.data.Xor[Failure, Success]。如何从 REST 端点返回此数据类型?如何为此编写响应编组器?

4

1 回答 1

0

最简单的解决方案就是调用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的版本中移除以支持标准库,因此现在仅使用可能是最实用的解决方案。EithertoEither

于 2016-09-22T15:15:02.287 回答