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)
归档时间: |
|
查看次数: |
2857 次 |
最近记录: |