2016-09-22 5 views
1

스프레이를 사용하고 json 마샬링에 어려움이있는 REST API를 작성 중입니다. 내 서비스는 cats.data.Xor [Failure, Success]를 반환합니다. REST 엔드 포인트에서이 데이터 유형을 리턴하려면 어떻게해야합니까? 어떻게 대응 마샬 러를 작성 하는가?스프레이 마샬링 cats.data.Xor

답변

0

가장 간단한 해결책은 라우터의 값으로 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으로가는 것이 가장 실용적인 해결책 일 수 있습니다.