【问题标题】:No implicits found for parameter evidence$2: BodyWritable[Map[String, Object]]没有为参数evidence$2找到隐含: BodyWritable[Map[String, Object]]
【发布时间】:2020-07-01 08:28:57
【问题描述】:

正在播放 ws 并且必须将请求参数准备为 {"initVideoUploadParams": {"videoMetadataParams":{"metadata":{"name":"","description":""}}}} 。尝试了link 中给出的解决方案,但没有奏效,因为我的情况与该问题不相似。 下面是代码sn-p

ws.url(savaUrl+configObj.get[String]("kaltura.init"))
                        .post(Map("initVideoUploadParams" -> InitVideoUploadParams(fileName,fileName)))

还有案例类

case class InitVideoUploadParams(name:String,desc:String)

object InitVideoUploadParams {

  implicit object InitVideoUploadParamsWrites {
    def writes(name:String,desc:String): JsObject = Json.obj(
      "videoMetadataParams" -> VideoMetadataParams(Utils.createVideoParamsMap(name,desc)).metadata
    )   } }

case class VideoMetadataParams(metadata: Map[String, String])

object VideoMetadataParams {   implicit object VideoMetadataParamsWrites {
    def writes(metadata:Map[String,String]): JsObject = Json.obj(
      "metadata" -> metadata
    )   } }

玩过documentation但无法实现。 帮助我了解我的代码有什么问题。

【问题讨论】:

  • 您的案例类看起来有问题。你确定它应该是一张地图吗?在您链接的示例中,它看起来像这样: case class Message(toID: Seq[String], fromID: String, userID: String, mailContent: String) object Message {implicit val writes: Writes[Message] = Json.writes[Message ] }
  • 我想要的最终请求 JSON 是 {"initVideoUploadParams": {"videoMetadataParams":{"metadata":{"name":"","description":""}}}} 所以我为元数据添加了 Map[String,String]。如果不是地图,那么我还应该使用什么? @GamingFelix
  • 在示例中,地图是 json。所以 JSON 变成了贴图。

标签: json scala playframework ws


【解决方案1】:

您正在尝试使用 Play-WS POST 类型为 Map[String, InitVideoUploadParams] 的值。为了让 Play 知道如何将该类型序列化为 JSON,需要在隐式范围内有一个 Writes[InitVideoUploadParams] 类型的对象。显然您正试图对那些 implicit objects 进行此操作,但您需要扩展 Writes 才能使其工作:

import play.api.libs.json.Writes
object InitVideoUploadParams {
  implicit object InitVideoUploadParamsWrites extends Writes[InitVideoUploadParams] {
    def writes(o: InitVideoUploadParams): JsValue = {
      ??? // implementation goes here
    }
  }
}

但是使用Writes伴随对象上的方法会更简单一些:

import play.api.libs.json.Writes
object InitVideoUploadParams {
  implicit val writes: Writes[InitVideoUploadParams] = Writes { o =>
    ??? //implementation goes here
  }
}

【讨论】:

    猜你喜欢
    • 2020-03-24
    • 2018-09-22
    • 2020-08-01
    • 1970-01-01
    • 2013-05-24
    • 2014-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多