无法在Play框架中找到可写的Action.async

时间:2014-05-16 15:13:31

标签: scala playframework

出现我缺少一些东西,但这里是我得到的(只发布相关的部分)。其中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”。是否有任何改进建议并使其更简洁?

1 个答案:

答案 0 :(得分: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)) }
  }

}