Play Framework:如何在scala中定义可写对象?

时间:2016-03-12 10:00:46

标签: scala playframework

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

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

如何将对象RepositoryMetadata变为Writeable

2 个答案:

答案 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