找不到 ^ 类型的证据参数的隐含值

Posted

技术标签:

【中文标题】找不到 ^ 类型的证据参数的隐含值【英文标题】:could not find implicit value for evidence parameter of type ^ 【发布时间】:2017-04-26 20:38:51 【问题描述】:

我正在尝试为 Post 请求编写测试

这是我的代码:

val request = CreateLinkRequest(token = Some(validToken),billing_ref_id = Some("123"), store_id = Some("123"), agent_id = Some("123"))

val endPoint = Uri(this.serverRootUrl + "path").toString
val post = Post(endPoint, request)
val pipeline = jsonAsStringPipeline(post)
val responseContents = Await.ready(pipeline, atMost = callMaxWaitDuration)

但这不编译,我一直收到这个错误:

Error:(156, 20) could not find implicit value for evidence parameter of type spray.httpx.marshalling.Marshaller[CreateLinkSpec.this.CreateLinkRequest]
    val post = Post(endPoint, request)
               ^
Error:(156, 20) not enough arguments for method apply: (implicit evidence$1: 

spray.httpx.marshalling.Marshaller[CreateLinkSpec.this.CreateLinkRequest])spray.http.HttpRequest in class RequestBuilder.
Unspecified value parameter evidence$1.
    val post = Post(endPoint, request)
                   ^

这是什么意思?

我该如何解决?

编辑: 这是正文中的 json:

 token:"123", billing_ref_id:"123", store_id:"123", agent_id:"123"

这是代码中的对象:

private final case class CreateLinkRequest(
    token: Option[String] = Some(validToken),
    billing_ref_id: Option[String] = Some(Random.alphanumeric.take(10).mkString),
    agent_id: Option[String] = Some(Random.alphanumeric.take(3).mkString),
    store_id: Option[String] = Some(Random.alphanumeric.take(3).mkString)
    )

【问题讨论】:

could not find implicit value for parameter marshaller: spray.httpx.marshalling.ToResponseMarshaller的可能重复 很遗憾这并不能解决我的问题 您的 POST 路线是什么样的?正文中是否需要 JSON? 是的,它在正文中需要 json,请参阅内容 json 对象的已编辑问题 【参考方案1】:

您正在尝试调用以implicit Marshaller 作为参数的Post 方法。请注意,只要编译器可以在范围内找到隐式参数,就不必提供隐式参数(查看此以获取有关隐式的更多信息:Where does Scala look for implicits?)

但是,您的代码没有定义任何隐式 Marshaller,因此编译器不知道如何将您的 case class 转换为 HttpEntity

在您的情况下,您希望将其转换为带有Content-Type: application/jsonHttpEntity。为此,您只需定义:implicit val CreateLinkRequestMarshaller: Marshaller[CreateLinkRequest]。这告诉scala如何将你的case class转换成HttpEntity

您还希望它作为 JSON 传递给上下文,因此我们将定义 JsonProtocol,即MyJsonProtocol

package test

import spray.http.HttpEntity
import spray.http._
import spray.json._
import spray.httpx.marshalling.Marshaller, MarshallingContext
import test.TestMarshaller.CreateLinkRequest


object MyJsonProtocol extends DefaultJsonProtocol 
  implicit def createLinkRequestFormat: JsonFormat[CreateLinkRequest] = jsonFormat4(CreateLinkRequest)


object TestMarshaller extends App 
  import MyJsonProtocol._

  case class CreateLinkRequest(token: Option[String], billing_ref_id: Option[String], store_id: Option[String], agent_id: Option[String])

  implicit val CreateLinkRequestMarshaller: Marshaller[CreateLinkRequest] = new Marshaller[CreateLinkRequest] 
    override def apply(value: CreateLinkRequest, ctx: MarshallingContext): Unit = 
      val entity = HttpEntity(MediaTypes.`application/json`, value.toJson.compactPrint)
      ctx.marshalTo(entity)
    
  

  // Here goes your test

请注意,您可以在其他地方定义这些隐式,例如package 然后将其导入测试类。这会更好,因为您肯定希望重用 Marshaller。

【讨论】:

以上是关于找不到 ^ 类型的证据参数的隐含值的主要内容,如果未能解决你的问题,请参考以下文章

关于 Scala 隐含多个类型参数的问题

Scala 类型参数化,Shapeless - 找不到参数 Generic 的隐式值

在“”类型上找不到带有“数字”类型参数的索引签名 - Typescript 编译器错误

找不到接受参数类型 'androidx.lifecycle.LiveData< 的 ~ItemBinding~ 的设置器

在类型上找不到带有“字符串”类型参数的索引签名

ObjectDataSource 找不到采用类型参数的非泛型方法