我无法从akka http流中解组基本字符串

时间:2018-01-18 19:00:13

标签: akka-stream akka-http play-json

我正在尝试在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)
        }
      }
    }
}

1 个答案:

答案 0 :(得分:0)

asSourceOf[T]尝试将传入的数据用作Source[T, _]。正如其method signature所示,asSourceOf[T]采用隐式FromByteStringUnmarshaller[T]参数。 de.heikoseeberger.akkahttpplayjson.PlayJsonSupport实用程序不提供此unmarshaller的实现(从1.19.0版本开始),但它确实提供了使用简单StringFoo所需的解组程序。这就是为什么您的代码在没有使用asSourceOf的情况下有效。

documentation中的示例使用SprayJsonSupport,它是Akka HTTP的一部分。如果您不想使用SprayJsonSupport,则必须实施FromByteStringUnmarshaller才能使用asSourceOf:链接的源代码可以让您了解如何使用INotifyPropertyChanged这样做。