1
스프레이를 사용하고 json 마샬링에 어려움이있는 REST API를 작성 중입니다. 내 서비스는 cats.data.Xor [Failure, Success]를 반환합니다. REST 엔드 포인트에서이 데이터 유형을 리턴하려면 어떻게해야합니까? 어떻게 대응 마샬 러를 작성 하는가?스프레이 마샬링 cats.data.Xor
스프레이를 사용하고 json 마샬링에 어려움이있는 REST API를 작성 중입니다. 내 서비스는 cats.data.Xor [Failure, Success]를 반환합니다. REST 엔드 포인트에서이 데이터 유형을 리턴하려면 어떻게해야합니까? 어떻게 대응 마샬 러를 작성 하는가?스프레이 마샬링 cats.data.Xor
가장 간단한 해결책은 라우터의 값으로 toEither
을 호출하는 것입니다.이 경우 스프레이 제공 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)
}
}
(이하 무시할 만하다).
고양이는 Xor
을 표준 라이브러리의 Either
버전을 대신하여 제거하고 있습니다. 따라서 지금은 toEither
으로가는 것이 가장 실용적인 해결책 일 수 있습니다.