【问题标题】:spray-json error: could not find implicit value for parameter umspray-json 错误:找不到参数 um 的隐式值
【发布时间】:2014-01-05 09:57:48
【问题描述】:

我有这个案例课

case class Person(val name: String)

object JsonImplicits extends DefaultJsonProtocol {
  implicit val impPerson = jsonFormat1(Person)
}

我正在尝试使用 spray-json 来解析发布请求:

  post {
    entity(as[Person]) { person =>
      complete(person)
    }
  }

但是当我尝试编译这个时我得到了:

src/main/scala/com/example/ServiceActor.scala:61:错误:不能 找到参数 um 的隐含值: spray.httpx.unmarshalling.FromRequestUnmarshaller[com.example.Person]

我不明白发生了什么,我该如何解决这个问题?

谢谢

【问题讨论】:

  • 您是否在路由中导入了 JsonImplicits._?
  • 别忘了导入 spray.httpx.SprayJsonSupport._

标签: scala akka implicit-conversion spray


【解决方案1】:

Spray 的 'entity[E]' 指令要求类型 E 在其范围内的隐式编组器。 JsonImplicits 对象为类型 E 创建 json marshaller 和 unmarshaller。

您需要确保implicit val impPerson 在范围内,换句话说,将import JsonImplicits._ 放在路由定义的上方。

【讨论】:

  • 我拔头发时遇到了完全相同的问题。尽管我读过很好的docs 甚至是相同的种子项目代码库,但我没有意识到该路线有不同的范围。 *范围规则*:插入的隐式转换必须作为单个标识符在范围内,或者与转换的源或目标类型相关联。 Scala 编译器只会考虑范围内的隐式转换。因此,要使隐式转换可用,您必须以某种方式将其纳入范围
【解决方案2】:
package abc.json

import spray.json.DefaultJsonProtocol


object OrderJsonProtocol extends DefaultJsonProtocol {

  implicit val orderFormat = jsonFormat1(Order)
}


case class Order(orderNumber: String)

import akka.actor.Actor
import abc.json._
import spray.routing.HttpService

class OrderRestServiceActor extends Actor with HttpService {

  def actorRefFactory = context

  def receive = runRoute(route)



  val route = {
    import OrderJsonProtocol._
    import spray.httpx.SprayJsonSupport.sprayJsonUnmarshaller


    path("order") {
      post {
        println("inside the path")
        entity(as[Order]) { order =>
         complete(s"OrderNumber: ${order.orderNumber}")
        }

      }
    }

  }

}

【讨论】:

  • 以上工作。很多人在上面说import,花了很长时间才弄明白。这是代码
猜你喜欢
  • 2016-02-13
  • 1970-01-01
  • 2015-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-05
  • 2017-02-02
  • 2016-01-17
相关资源
最近更新 更多