/ / Play Framework: ¿Cómo definir un objeto escribible en scala? - Scala, playframework

Play Framework: ¿Cómo definir un objeto escribible en scala? - Scala, playframework

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 № 1

Deberá 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]
}