我创建了一个简单的控制器(下面的代码经过混淆和简化,假设ask返回带有消息的未来)。我想要做的是将HTTP代码从200以外的其他东西更改(基于演员结果)。
执行下面的代码时,我看到结果按预期返回,但使用200而不是404
/
另一次尝试是
get("/:id") {
new AsyncResult() {
val is: Future[_] = ask(actor, message)(timeout.toMillis)
is.onComplete { res =>
res match {
case Success(result:Any) => NotFound(result) //Not found is just an example of a different HTTP code other than 200
}
}
}
在这种情况下,我收到NullPointerException,因为case Success(result:Any) => {
this.status_ = (404)
result
}
(HTTPServletResponse)为空,因为响应是在一个单独的线程上。
TL; DR
如何在Scalatra中有条件地更改AsyncResult / Future的HTTP代码?
详情
Scala 2.11.6
Scalatra 2.3.0
Akka 2.3.9
答案 0 :(得分:2)
在Scalatra FutureSupport
mixin中进行了一些挖掘后,我发现:
implicit val response: HttpServletResponse = scalatraContext.response
定义为AsyncResult
的成员,允许我在onComplete回调中更改HTTP请求的状态代码。
答案 1 :(得分:0)
如果需要,您实际上可以将Future[ActionResult]
返回到is
。然后在Future
内部,您可以返回Ok()