【问题标题】:Unable to find Writable inside Action.async in play framework无法在播放框架中的 Action.async 中找到 Writable
【发布时间】:2014-05-17 01:37:02
【问题描述】:

似乎我遗漏了一些东西,但这是我所得到的(仅发布相关部分)。其中 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) 的其他地方使用,在那里它找到并且工作正常。 有什么特别要 async 好的吗?

编辑 看来 Ok() 方法无法确定需要将 MyCompany 转换为 json。以下似乎有效。

Ok(Json.toJson(mm) )

这是因为 Ok 的参数可以变化吗?另外,上面的代码中有太多的“地图”。有什么改进建议并使它更简洁吗?

【问题讨论】:

    标签: scala playframework


    【解决方案1】:

    您的编译器错误是关于 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)) }
      }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-14
      相关资源
      最近更新 更多