[英]Play Framework: How to define a writable object in scala?
使用Play,我有一个名为RepositoryMetadata
的对象。 我想在一个名为post
的方法中使用该对象。 该方法的定义如下。
def post[T](body: T)(implicit wrt: Writeable[T], ct: ContentTypeOf[T]): Future[WSResponse]
。
我如何使物体RepositoryMetadata
到Writeable
。
对于任何有兴趣的人,我在使用Play的WSClient时遇到了类似的问题。 我目前使用的版本(2.5.3)具有以下签名:
def post[T](body: T)(implicit wrt: Writeable[T]): Future[WSResponse]
如果您碰巧需要将有效负载作为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
接着
import WritableImplicits._
...
val metadata: RepositoryMetadata = ???
wsClient.url(url).post(metadata)
...
这应该是它!
注意:如果您没有在作用域中定义隐式Writes
,则可以执行以下操作:
import play.api.libs.json._
object RepositoryMetadata {
implicit val repositoryMetadataWrites = Json.writes[RepositoryMetadata]
}
您需要包含两个含义:
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.