2014-05-16 32 views
1

出現我失去了一些東西,但這裏是我得到的(張貼只有相關的一塊)。 MyService.save返回Future [Option [MyCompany]]。無法找到在Action.async中的播放框架內寫入

def myPost = Action.async(parse.json) { request => 
val mn = Json.fromJson[MyEntity](request.body) 
mn.map{ 
    case m : MyEntity => MyService.save(m).map{f=> 
    f.map(mm=> Ok(mm)) 
    } 

}.recoverTotal { 
    e => Future { BadRequest("Detected error:" + JsError.toFlatJson(e)) } 
} 


} 

雖然我已經定義

implicit val companyWriter: Writes[MyCompany] = (...) 

這隱含的是在範圍內,它顯示編譯出錯

Cannot write an instance of MyCompany to HTTP response. Try to define 
a Writeable[MyCompany] 

FYI:在我做Json.toJson這個作家在其他地方使用(myCompany),並在那裏找到並正常工作。 任何東西特別是異步確定它缺少?

編輯 看來,Ok()方法找不到MyCompany需要轉換爲json。以下似乎工作。

Ok(Json.toJson(mm)) 

這是因爲Ok的參數可以變化嗎?另外上面的代碼中有太多的「地圖」。任何改進建議並使其更簡潔?

回答

2

您的編譯器錯誤是關於Writeable而不是WritesWriteables用於將所有內容轉換爲可寫入HTTP響應的內容,Writes用於將對象編組爲JSON。名字可能有點混亂。

至於風格。

def myPost = Action.async(parse.json) { request => 
    request.body.validate[MyEntity] map { myEntity => 

    MyService.save(myEntity).map { maybeCompany => 

     maybeCompany match { 
     case Some(company) => Ok(Json.toJson(company)) 
     case None   => NoContent // or whatever's appropriate 
     } 

    } 

    } recoverTotal { t => 
    Future { BadRequest("Detected error: " + JsError.toFlatJson(e)) } 
    } 

}