如何避免耦合到Play 2.3中的表示?

时间:2014-12-14 13:11:20

标签: scala playframework playframework-2.3

Play 2.3文档中的RESTful example操作内容为:

def listPlaces = Action {
  val json = Json.toJson(Place.list)
  Ok(json)
}

是什么让该方法与这种特定的JSON格式紧密结合。

是否可以将服务逻辑与内容表示分开,例如JAX-RS与MessageBody Writers and Readers一起使用?

1 个答案:

答案 0 :(得分:1)

Ok(json)实际上正在调用Status.apply。它需要play.api.http.Writeable[A],这可以将A转换为字节数组并返回A的内容类型。在您的情况下,A代表JsValue

你可以做的是更进一步提供Writeable[Place],所以你可以这样写:

def listPlaces(implicit writeable: Writeable[Place]) = Action {
  Ok(Place.list)
}

我假设您已经有Writes[Place]。剩下的就是实现一个将json Writes转换为http Writeable的通用函数:

implicit def jsonWritesToHttpWriteable[A](jsWrites: Writes[A])
                                         (implicit writeable: Writeable[JsValue]): Writeable[A] =
  writeable.map(jsWrites.writes)

现在,将此转换功能定义为隐式,您可以在致电Writes[Place]时提供listPlaces

val listPlacesJson = listPlaces(placeJsonWrites)

当然,您的路线现在必须指向listPlacesJson