2016-09-22 3 views
1

私はスプレーを使用してREST APIを作成しています.Jsonマーシャリングでいくつかの問題があります。私のサービスはcats.data.Xor [失敗、成功]を返します。このデータ型を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) 
    } 
    } 

(以下ごくわずかです)。猫は、標準ライブラリのEitherしかし今後のバージョンでは、これだけ今のtoEither一緒に行くの賛成でXorを削除して

注意は最も現実的な解決策になることがあります。