2015-06-18 35 views
2

我已經創建了一個簡單的控制器(下面的代碼是混淆和簡化的,假設ask會返回一個帶有消息的未來)。我想要做的是將HTTP代碼從200以外的地方更改(基於actor結果)。如何使用Scalatra更改AsyncResult的HTTP狀態代碼

當執行下面的代碼,我看到的結果回來如預期,但與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 
      } 
     } 
    } 

另一個嘗試

case Success(result:Any) => { 
    this.status_ = (404) 
    result 
} 

在這種情況下,我得到一個NullPointerException,因爲response(HTTPServletResponse)爲空,原因是響應位於單獨的線程中。

TL; DR

怎樣一個有條件地改變AsyncResult /未來的HTTP代碼了Scalatra?

詳細

斯卡拉2.11.6

了Scalatra 2.3.0

阿卡2.3.9

回答

1

在Scalatra的FutureSupport混入一些挖後,我發現:

implicit val response: HttpServletResponse = scalatraContext.response 

定義爲AsyncResult的成員,它允許我在onComplete回調中更改HTTP請求的狀態碼。