Play框架:如何在Scala中定义可写对象?

edd*_*ark 3 scala playframework

使用Play,我有一个名为的对象RepositoryMetadata。我想在称为的方法中使用该对象post。该方法的定义在下面给出。

def post[T](body: T)(implicit wrt: Writeable[T], ct: ContentTypeOf[T]): Future[WSResponse]

我如何使对象RepositoryMetadata变成Writeable

小智 6

对于任何有兴趣的人,在使用Play的WSClient时都会遇到类似的问题。我当前正在使用的版本(2.5.3)具有以下签名:

def post[T](body: T)(implicit wrt: Writeable[T]): Future[WSResponse]
Run Code Online (Sandbox Code Playgroud)

如果您碰巧需要将有效内容发布为json(只要您已经play.api.libs.json.Writes为类定义了转换器),则可能会出现以下内容:

import play.api.http.{ContentTypeOf, ContentTypes, Writeable}
import play.api.libs.json.Writes
import play.api.mvc.Codec

trait WritableImplicits {
  implicit def jsonWritable[A](implicit writes: Writes[A], codec: Codec): Writeable[A] = {
    implicit val contentType = ContentTypeOf[A](Some(ContentTypes.JSON))
    val transform = Writeable.writeableOf_JsValue.transform compose (writes.writes _)
    Writeable(transform)
  }
}

object WritableImplicits extends WritableImplicits
Run Code Online (Sandbox Code Playgroud)

然后

import WritableImplicits._
...
val metadata: RepositoryMetadata = ???
wsClient.url(url).post(metadata)
...
Run Code Online (Sandbox Code Playgroud)

就是这样!

注意:如果Writes在范围中没有隐式定义,则可以执行以下操作:

import play.api.libs.json._

object RepositoryMetadata {
   implicit val repositoryMetadataWrites = Json.writes[RepositoryMetadata]  
}
Run Code Online (Sandbox Code Playgroud)