Play 2.3文档中的RESTful example操作内容为:
def listPlaces = Action {
val json = Json.toJson(Place.list)
Ok(json)
}
是什么让该方法与这种特定的JSON格式紧密结合。
是否可以将服务逻辑与内容表示分开,例如JAX-RS与MessageBody Writers and Readers一起使用?
答案 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
。