繁体   English   中英

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

[英]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]

我如何使物体RepositoryMetadataWriteable

对于任何有兴趣的人,我在使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM