如何以编程方式执行拒绝处理程序Route
并获得结果HttpEntity
?
例如假设我有RequestContext
个对象和Rejection
个对象,我想在其上执行RejectionHandler.default
并获得HttpEntity
。
以下是我要做的事情的例子:
implicit def myRejectionHandler =
RejectionHandler.newBuilder()
.handleAll[Rejection] { rejections ⇒
def prefixEntity(entity: ResponseEntity): ResponseEntity = entity match {
case HttpEntity.Strict(contentType, data) => {
import spray.json._
val text = ErrorResponse(0, "Rejection", data.utf8String).toJson.prettyPrint
HttpEntity(ContentTypes.`application/json`, text)
}
case _ =>
throw new IllegalStateException("Unexpected entity type")
}
val route: Route = extractRequestContext { ctx =>
mapResponseEntity(prefixEntity) {
// Here I want result of `complete` route from RejectionHandler.default
}
}
route
}
.handleNotFound {
complete((NotFound, "Not here!"))
}
.result()
答案 0 :(得分:2)
我想我得到了你想要的东西。您可以在注释所在的位置应用默认拒绝处理程序。唯一的问题是apply
返回Option
,如果遇到的拒绝没有点击拒绝处理程序中的任何内容,那么None
将会getOrElse
。这不太可能,因为您使用的是默认处理程序,它几乎可以处理所有内容,但您仍需要在代码中对其进行说明(因此我的InternalServerError
会产生通用的val defaultRejectionHandler = RejectionHandler.default
implicit def myRejectionHandler =
RejectionHandler.newBuilder()
.handleAll[Rejection] { rejections ⇒
def prefixEntity(entity: ResponseEntity): ResponseEntity = entity match {
case HttpEntity.Strict(contentType, data) => {
import spray.json._
val text = ErrorResponse(0, "Rejection", data.utf8String).toJson.prettyPrint
HttpEntity(ContentTypes.`application/json`, text)
}
case _ =>
throw new IllegalStateException("Unexpected entity type")
}
val route: Route = extractRequestContext { ctx =>
mapResponseEntity(prefixEntity) {
defaultRejectionHandler.apply(rejections).getOrElse{
complete(StatusCodes.InternalServerError)
}
}
}
route
}
.handleNotFound {
complete((NotFound, "Not here!"))
}
.result()
)。修改后的代码如下所示:
RequestContext
这编译,但我实际上没有测试它,看看我们是否得到了预期的效果。此外,我不需要ctx
值extractRequestContext
,因此您可以删除其中的Rows | TotalCount
1 | 20
2 | 30
3 | 10
4 | 60
图层。