akka-http 错误:找不到参数 um 的隐式值:akka.http.scaladsl.unmarshalling.FromRequestUnmarshaller
Posted
技术标签:
【中文标题】akka-http 错误:找不到参数 um 的隐式值:akka.http.scaladsl.unmarshalling.FromRequestUnmarshaller【英文标题】:akka-http error: could not find implicit value for parameter um: akka.http.scaladsl.unmarshalling.FromRequestUnmarshaller 【发布时间】:2016-02-13 07:44:01 【问题描述】:我知道已经有人问过了,但我似乎找不到答案。 这是我的代码:
import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport
import spray.json.DefaultJsonProtocol
final case class Client(clientId:Int, clientName:String, platformIds:Int, host:String, password:String)
object ClientJson extends DefaultJsonProtocol with SprayJsonSupport
implicit val clientFormat = jsonFormat5(Client)
class HTTPListenerActor extends Actor with ImplicitMaterializer with RoadMap
implicit val conf = context.system.settings.config
implicit val system = context.system
implicit val ec = context.dispatcher
Await.result(Http().bindAndHandle(roads, "interface", 8080), Duration.Inf)
override def receive:Receive = Actor.emptyBehavior
trait RoadMap extends Directives
val roads: Route = path("client"/IntNumber) id =>
import ClientJson._
post
entity(as[Client]) c => complete c
此代码产生错误
[ant:scalac] /Users/smalov/Workspace/api-service/src/main/scala/com/acheron/HTTPListenerActor.scala:51: error: could not find implicit value for parameter um: akka.http.scaladsl.unmarshalling.FromRequestUnmarshaller[com.acheron.Client]
[ant:scalac] entity(as[Client]) c =>
现在这种错误最常见的原因是忘记将编组隐式导入roads
定义附近的范围,但是,我没有忘记这一点。另一个原因可能是我在作用域中隐含了FlowMaterializer
而不是ActorMaterializer
,但是ImplictMaterializer
trait 可以解决这个问题。
还有什么我可能会错过的吗?
我正在使用 Scala 2.11.7、Akka 2.3.11、akka-http 1.0、spray-json 1.3.2
【问题讨论】:
【参考方案1】:我也遇到了同样的错误,导入后解决了
import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport._
也许这会有所帮助
【讨论】:
请注意,您需要导入"com.typesafe.akka" %% "akka-http-spray-json" % "10.0.5"
以使 SprayJsonSupport
处于范围内。话虽如此,它并没有为我解决问题。【参考方案2】:
进口这些东西。
import spray.json.RootJsonFormat
import spray.json.DefaultJsonProtocol._
然后在您调用entity(as[Client])
时将其包含在范围内
implicit val clientJsonFormat: RootJsonFormat[Client] = jsonFormat5(Client)
将其包含在范围内的常规方法是将这些包含在特征中,例如
trait MyJSON extends SprayJsonSupport with DefaultJsonProtocol with NullOptions
implicit val clientJsonFormat: RootJsonFormat[Client] = jsonFormat5(Client)
然后,您将其混合到包含您的网络路由的对象中,因此:
object MyWeb extends MyJSON
val myRoute =
get
path("client")
complete(Future successful Client(...))
~ post
path("client")
entity(as[Client]) client =>
...
【讨论】:
【参考方案3】:看来我需要ActorMaterializer
在RoadMap
trait 的范围内。所以,在那里添加implicit val materializer: ActorMaterializer
解决了编译问题。
我希望该错误更具描述性....
【讨论】:
以上是关于akka-http 错误:找不到参数 um 的隐式值:akka.http.scaladsl.unmarshalling.FromRequestUnmarshaller的主要内容,如果未能解决你的问题,请参考以下文章
Scala 类型参数化,Shapeless - 找不到参数 Generic 的隐式值