是否可以在spray.io?

时间:2015-08-10 12:31:45

标签: scala akka spray spray-dsl

我有以下代码片段,其中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))
  }

我无法找到一个合适的方式从marshaller和路线通过完整的功能我无法使它工作。

更有经验的人可以给我一个暗示吗?我在这里错过了一些重要的概念吗?

THX

更新:错误消息“Future [Object]类型的表达式不符合预期类型ToResponseMarsallable。

2 个答案:

答案 0 :(得分:0)

代码看起来不错,不确定什么不起作用。尝试使用Spray指令重写它,而不是完成未来:

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

onSuccess(locationData.map(remapInfoboxToResponseObject)) {
  case None => complete(StatusCodes.NotFound)
  case Some(data) => complete(data)
}

答案 1 :(得分:0)

这对我很有利,可以利用MetaMarshallers

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