2016-08-19 10 views
1

aka-httpからオプションの結果を返すときに問題が発生しています。いただければ幸いですオプションの結果がakka-http

[error] found : scala.concurrent.Future[akka.http.scaladsl.server.StandardRoute] 
[error] required: akka.http.scaladsl.server.Route 
[error]  (which expands to) akka.http.scaladsl.server.RequestContext => scala.concurrent.Future[akka.http.scaladsl.server.RouteResult] 
[error]  contactService.getById(id).map { 

すべてのヘルプ:

は、基本的には私との誤差を与える404

pathPrefix("contacts"/Segment) { id => 
    get { 
     contactService.getById(id).map { 
     case Some(c: ContactDto) => complete(OK -> toResource(c)) 
     case None => complete(HttpResponse(NotFound)) 
     } 
    } 
    } 

がある可能性があります取得です。

答えて

0

ここに表示されている問題は、Futureを使用していて、Optionが原因ではありません。私はcontactService.getById(id)という呼出しがFutureを返すと仮定しよう。ルーティングツリー内の任意のルートの結果はRequestContext => Future[RouteResult]の略語で、Futureはそれ自体がRouteではないため、この状況に対処するには小さな変更を加える必要があります。あなたは次のようにFutureとの組み合わせでonCompleteディレクティブを使用することができるはずです。

pathPrefix("contacts"/Segment) { id => 
    get { 
    val fut = contactService.getById(id) 
    onComplete(fut){ 
     case util.Success(Some(c: ContactDto)) => 
     complete(OK -> toResource(c)) 
     case util.Success(None) => 
     complete(HttpResponse(NotFound)) 
     case util.Failure(ex) => 
     complete(HttpResponse(InternalServerError)) 
    } 
    } 
} 

をこのコードは今FutureSomeで成功を収め、Noneと成功と失敗)から3つの可能な結果を​​処理し、これらのケースごとにRouteを生成します。これはあなたの問題を解決するはずです。

0

@ cmbaxterの回答は正しいですが、上記の3つのケース(OK、NotFound、InternalServerError)の標準ステータスコードが揃っていれば、Future[Option[T]]を返す関数で直接完了するだけでコードを単純化できます。 toResourceと仮定さ

pathPrefix("contacts"/Segment) { id => 
    get { 
    complete(contactService.getById(id).map(toResource)) 
    } 
} 

ToEntityMarshallerその関数によって返されたタイプのために存在する型を返します。 AkkaはFutureOptionの機械を証明しているので、Tの部分を供給するだけです。たとえば、jsonを返していて、spray-jsonを使用していた場合は、JsonWriter[T]を定義し、akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupportのimplicitsが残りを行います。 spray-json-supportを参照してください。

map(toResource)が実際に必要とされないかもしれないが、私はそれが他のいくつかのタイプにContactDtoの追加の変換を行うと仮定している - そのだけでJSONまたは同様に変換ならば、あなたはそれをドロップして内蔵のマーシャリングのサポートを使用することができます上述した。

関連する問題