使用Play,我有一个名为RepositoryMetadata
的对象。我想在名为post
的方法中使用该对象。该方法的定义如下。
def post[T](body: T)(implicit wrt: Writeable[T], ct: ContentTypeOf[T]): Future[WSResponse]
。
如何将对象RepositoryMetadata
变为Writeable
。
答案 0 :(得分:3)
对于任何有兴趣的人,我在使用Play的WSClient时遇到了类似的问题。我目前正在使用的版本(2.5.3)具有以下签名:
(function() {
console.log(typeof foo); // (A) function pointer
var foo = 'hi';
function foo() {
return 'hello';
}
console.log(foo); // (C) hi
foo();// (D) TypeError: foo is not a function
})();
如果你碰巧需要将有效负载作为json发布(只要你已经为你的类定义了def post[T](body: T)(implicit wrt: Writeable[T]): Future[WSResponse]
转换器),你就可以得到如下内容:
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
那应该是它!
注意:
如果您未在范围内定义隐式import WritableImplicits._
...
val metadata: RepositoryMetadata = ???
wsClient.url(url).post(metadata)
...
,则可以执行以下操作:
Writes
答案 1 :(得分:2)
您需要包含两个含义:
import play.api.http._
import play.api.mvc._
implicit def writeable(implicit codec: Codec): Writeable[RepositoryMetadata] = {
// assuming RepositoryMetadata has a .toString
Writeable(data => codec.encode(data.toString))
}
implicit def contentType(implicit codec: Codec): ContentTypeOf[RepoositoryMetadata] = {
// for text/plain
ContentTypeOf(Some(ContentTypes.TEXT))
}
两个导入导入以下内容:
play.api.http.ContentTypes
play.api.http.ContentTypeOf
play.api.http.Writeable
play.api.mvc.Codec