我正在尝试在akka-http中使用json对象流。 (akka http版“10.0.9”,akka-http-play-json版本1.10.1)
我在网上关注示例但是,对于String我得到了:
could not find implicit value for parameter um: akka.http.scaladsl.unmarshalling.FromByteStringUnmarshaller[String]
和我的用户定义的Foo案例类(我为其提供了json协议):
could not find implicit value for parameter um: akka.http.scaladsl.unmarshalling.FromByteStringUnmarshaller[server.Foo]
这是简化的代码。我提供了EntityStreamingSupport.json()
和Foo对象的Json格式。我不认为我需要一个String。如果我没有放置asSourceOf
并读取一个简单的String对象或一个Foo case类对象,则代码可以正常工作。我错过了什么?
package server
import akka.http.scaladsl.common.EntityStreamingSupport
import akka.http.scaladsl.server.{ Directives, Route }
import akka.http.scaladsl.model.StatusCodes
import de.heikoseeberger.akkahttpplayjson.PlayJsonSupport._
import play.api.libs.json._
case class Foo(bar: String)
class StreamingMarketDataUpload extends Directives {
implicit val jsonStreamingSupport = EntityStreamingSupport.json()
implicit val jsonFooFormat = Json.format[Foo]
lazy val routes: Route =
path("upload1") {
post {
entity(as[String]) { input =>
complete(StatusCodes.OK)
}
}
} ~ path("upload2") {
post {
// Compile error here
entity(asSourceOf[String]) { marks =>
complete(StatusCodes.OK)
}
}
} ~ path("upload3") {
post {
entity(as[Foo]) { input =>
complete(StatusCodes.OK)
}
}
} ~ path("upload4") {
post {
// Compile error here
entity(asSourceOf[Foo]) { marks =>
complete(StatusCodes.OK)
}
}
}
}
答案 0 :(得分:0)
asSourceOf[T]
尝试将传入的数据用作Source[T, _]
。正如其method signature所示,asSourceOf[T]
采用隐式FromByteStringUnmarshaller[T]
参数。 de.heikoseeberger.akkahttpplayjson.PlayJsonSupport
实用程序不提供此unmarshaller的实现(从1.19.0版本开始),但它确实提供了使用简单String
或Foo
所需的解组程序。这就是为什么您的代码在没有使用asSourceOf
的情况下有效。
documentation中的示例使用SprayJsonSupport
,它是Akka HTTP的一部分。如果您不想使用SprayJsonSupport
,则必须实施FromByteStringUnmarshaller
才能使用asSourceOf
:链接的源代码可以让您了解如何使用INotifyPropertyChanged
这样做。