0

dataService が Option[LocationDataResult] を返す次のコード スニペットがあります。dataService が None を返すときに NotFound を設定し、Some( ...) の場合にデータを送り返したいと思います。

私は次のコードを持っています:

  val route: Route = {
    pathPrefix("service" / "data") {
      pathPrefix( "infobox") {
        get {
          parameters(('mes.as[String], 'oks.as[String])) {
            (me, okr) =>

              val resp = dataService.ask(GetocationInfoboxData(me,okr)).mapTo[LocationInfoboxDataResult]
                .map(remapInfoboxToResponseObject(_)).map { r =>
                r match {
                  case None => StatusCodes.NotFound
                  case Some(dataToRespond) => dataToRespond
                }
              }

              complete {
                resp
              }
          }
        }
      }
    }
  }


  implicit val responseMarhaller: Marshaller[LocationInfobox] = Marshaller.of[WikiLocationInfobox](ContentTypes.`application/json`) { (value, contentType, ctx) =>
    val result: String = mapper.writeValueAsString(value)
    ctx.marshalTo(HttpEntity(contentType, result))
  }

マーシャラーから適切な方法を見つけることができず、ルートから完全な機能を介して機能させることができません。

経験豊富な誰かが私にヒントを与えることができますか?ここでいくつかの重要な概念が欠けていますか?

どうも

更新: エラー メッセージ"型 Future[Object] の式は、予期される型 ToResponseMarsallable に準拠していません。

4

2 に答える 2

0

コードは問題ないように見えますが、何が機能しないのかわかりません。フューチャ自体を完了するのではなく、フューチャのスプレー ディレクティブで書き直してみてください。

val locationData = dataService.ask(GetocationInfoboxData(me,okr)).mapTo[LocationInfoboxDataResult]

onSuccess(locationData.map(remapInfoboxToResponseObject)) {
  case None => complete(StatusCodes.NotFound)
  case Some(data) => complete(data)
}
于 2015-08-10T13:00:35.223 に答える