我有一项服务,可在将来返回Option [ProductDoc](请客气地问)

我该如何在喷涂工艺中做出反应,以使有效的产品与一种产品相对应,而一个未知但结构良好的产品则返回404?

我希望代码填补这里的空白:

get {
    path("products" / PathElement) { productID:String =>
      val productFuture = (productService ? ProductService.Get(productID)).mapTo[Option[ProductDoc]]

      // THE CODE THAT GOES HERE SO THAT
      // IF PRODUCT.ISDEFINED RETURN PRODUCT ELSE REJECT

    }
}


我上班的唯一途径就是憎恶这个:

get {
    path(PathElement) { productID:String =>
      val productFuture = (productService ? ProductService.Get(productID)).mapTo[Option[ProductDoc]]
      provide(productFuture).unwrapFuture.hflatMap {
        case x => provide(x)
      } { hResponse:shapeless.::[Option[ProductDoc], HNil] =>
        hResponse.head match {
          case Some(product) => complete(product)
          case None => reject
        }
      }
    }
  }


当然,这不是正确的方法吗?这似乎是一个非常简单的模式,必须已经有人解决了!

最佳答案

Spray已经支持您的用例:默认情况下,选项值None被编组为EmptyEntity。这可能是您进行任何更改之前所看到的:200的文档为空。有一个指令可将空文档转换为404 rejectEmptyResponse,您可以将其包裹在需要此行为的部分路线中。

您的路线将如下所示:

  rejectEmptyResponse {
    path("products" / PathElement) { productID:String =>
      val productFuture = // same as before
      complete(productFuture)
    }
  }


当然,您可以将rejectEmptyResponse放入路径中,具体取决于是否要包装更多的路径零件。

更多信息:


https://github.com/spray/spray/blob/master/spray-routing/src/main/scala/spray/routing/directives/MiscDirectives.scala#L117
http://spray.io/documentation/spray-routing/key-concepts/rejections/#empty-rejections

关于scala - 喷涂路线404响应,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15347088/

10-11 11:03