出现我缺少一些东西,但这里是我得到的(只发布相关的部分)。其中MyService.save返回Future [Option [MyCompany]]。
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]
仅供参考:这位作家在我做Json.toJson(myCompany)的其他地方使用,在那里它找到并且工作正常。 特别是异步的任何东西确定它丢失了吗?
修改 看来Ok()方法无法弄清MyCompany需要转换为json。以下似乎有效。
Ok(Json.toJson(mm) )
这是因为Ok的参数可能会有所不同吗?另外,上面的代码中有太多“map”。是否有任何改进建议并使其更简洁?
答案 0 :(得分:2)
您的编译器错误大约是Writeable
,而不是Writes
。 Writeables
用于将您拥有的任何内容转换为可以写入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)) }
}
}