2016-09-22 96 views
1

我正在寫REST api使用噴霧,並與json編組有一些困難。我的服務返回cats.data.Xor [失敗,成功]。我如何從REST端點返回這種數據類型?如何爲此編寫響應編組器?噴霧編組cats.data.Xor

回答

0

最簡單的解決方案就是對您的路由器的值調用toEither,該值允許Spray提供的編組器接管。

另一個解決方案是提供自己的編組(我已經這樣做了一個自己幾次):

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) 
    } 
    } 

這可以讓你同時避免運行時的成本(可能是可以忽略不計)和句法成本(少可以忽略不計)的轉換。

注意貓是贊成的標準庫的Either在即將到來的版本,雖然與toEither所以只是去消除現在可以Xor是最實際的解決方案。