我有一个服务,它在Future中返回一个Option [ProductDoc](作为akka问)
我如何回应喷涂路线,以便有效的产品代表产品但是未知但形成良好的产品会返回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
}
}
Run Code Online (Sandbox Code Playgroud)
我可以上班的唯一方法就是这种可憎的行为:
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
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
这肯定不是实现这一目标的正确方法吗?这似乎是一个非常简单的模式,必须已经被某人解决了!
jru*_*lph 17
Spray已经支持您的用例:默认情况下,选项值None被编组为a EmptyEntity.这可能是您在进行任何更改之前看到的内容:带有空文档的200.有一个指令可以将一个空文档转换为404,rejectEmptyResponse您可以将自己的行为部分包裹在路径中.
您的路线看起来就像这样:
rejectEmptyResponse {
path("products" / PathElement) { productID:String =>
val productFuture = // same as before
complete(productFuture)
}
}
Run Code Online (Sandbox Code Playgroud)
当然,您可以rejectEmptyResponse根据是否要用它包装更多的路径部分来放置路径.
更多信息:
| 归档时间: |
|
| 查看次数: |
5321 次 |
| 最近记录: |