【问题标题】:Is it possible to set Response Code from Marshaller in spray.io?是否可以在 spray.io 中设置 Marshaller 的响应代码?
【发布时间】:2015-11-02 08:56:58
【问题描述】:

我有以下代码 sn-p,其中 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 类型。

【问题讨论】:

    标签: scala akka spray spray-dsl


    【解决方案1】:

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

    val locationData = dataService.ask(GetocationInfoboxData(me,okr)).mapTo[LocationInfoboxDataResult]
    
    onSuccess(locationData.map(remapInfoboxToResponseObject)) {
      case None => complete(StatusCodes.NotFound)
      case Some(data) => complete(data)
    }
    

    【讨论】:

      【解决方案2】:

      这对我来说很好,可以利用 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)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-08-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-08-08
        • 1970-01-01
        • 2018-07-27
        相关资源
        最近更新 更多