Usando Play, tengo un objeto llamado RepositoryMetadata
. Quiero usar ese objeto en un método llamado post
. La definición de ese método se da a continuación.
def post[T](body: T)(implicit wrt: Writeable[T], ct: ContentTypeOf[T]): Future[WSResponse]
.
Como hago el objeto RepositoryMetadata
dentro Writeable
.
Respuestas
2 para la respuesta № 1Deberá incluir dos implicaciones:
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))
}
Las dos importaciones importan lo siguiente:
play.api.http.ContentTypes
play.api.http.ContentTypeOf
play.api.http.Writeable
play.api.mvc.Codec
1 para la respuesta № 2
Para cualquier persona interesada, me he encontrado con un problema similar cuando uso el WSClient de Play. La versión que estoy usando actualmente (2.5.3) tiene la siguiente firma:
def post[T](body: T)(implicit wrt: Writeable[T]): Future[WSResponse]
Si necesita publicar la carga útil como un json (siempre y cuando ya tenga un play.api.libs.json.Writes
convertidor definido para su clase) podría tener algo como a continuación:
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
y entonces
import WritableImplicits._
...
val metadata: RepositoryMetadata = ???
wsClient.url(url).post(metadata)
...
Y eso debería ser!
NOTA: Si no tienes un implícito Writes
Definido en su alcance, puedes hacer lo siguiente:
import play.api.libs.json._
object RepositoryMetadata {
implicit val repositoryMetadataWrites = Json.writes[RepositoryMetadata]
}