喷雾路由 - akka 询问 Marshaller
spray-routing - akka ask with Marshaller
我正尝试按照原始文档中的示例在 spray.io 中完成一项服务,但我一直卡在错误消息中:
could not find implicit value for parameter marshaller: spray.httpx.marshalling.ToResponseMarshaller[scala.concurrent.Future[AdImporterServiceActor.StatusOfImport]]
val adServiceRoute: Route = {
path("service" / "import" / "status") {
get {
respondWithMediaType(`text/plain`) {
complete {
adImporterService.ask(GetImportStatus)(1 second).mapTo[StatusOfImport]
}
}
}
}
}
implicit val importStatusMarshaller: Marshaller[StatusOfImport] =
Marshaller.of[StatusOfImport](ContentTypes.`text/plain`) { (value, contentType, ctx) =>
val string = "Hello marshalled status"
ctx.marshalTo(HttpEntity(contentType, string))
}
其中
case class StatusOfImport(statuses: Map[String, ImportStatus], activeRequests:Set[Import])
case class ImportStatusUpdate(adId: String, statusUpdate: ImportStatus)
我不确定我在这里遗漏了什么。有经验的人可以给点提示吗?
感谢
我认为您需要隐式 ExecutionContext
范围,以提供 Future
编组能力。
改这部分,也import scala.concurrent.ExecutionContext.Implicits.global
respondWithMediaType(MediaTypes.`text/plain`) { ctx=>
(adImporterService.ask(GetImportStatus)(1 second).mapTo[StatusOfImport]).onComplete {
case Success(s) => ctx.complete(s)
case Failure(x)=> ctx.complete(StatusCodes.RequestTimeout)
}
}
我正尝试按照原始文档中的示例在 spray.io 中完成一项服务,但我一直卡在错误消息中:
could not find implicit value for parameter marshaller: spray.httpx.marshalling.ToResponseMarshaller[scala.concurrent.Future[AdImporterServiceActor.StatusOfImport]]
val adServiceRoute: Route = {
path("service" / "import" / "status") {
get {
respondWithMediaType(`text/plain`) {
complete {
adImporterService.ask(GetImportStatus)(1 second).mapTo[StatusOfImport]
}
}
}
}
}
implicit val importStatusMarshaller: Marshaller[StatusOfImport] =
Marshaller.of[StatusOfImport](ContentTypes.`text/plain`) { (value, contentType, ctx) =>
val string = "Hello marshalled status"
ctx.marshalTo(HttpEntity(contentType, string))
}
其中
case class StatusOfImport(statuses: Map[String, ImportStatus], activeRequests:Set[Import])
case class ImportStatusUpdate(adId: String, statusUpdate: ImportStatus)
我不确定我在这里遗漏了什么。有经验的人可以给点提示吗?
感谢
我认为您需要隐式 ExecutionContext
范围,以提供 Future
编组能力。
改这部分,也import scala.concurrent.ExecutionContext.Implicits.global
respondWithMediaType(MediaTypes.`text/plain`) { ctx=>
(adImporterService.ask(GetImportStatus)(1 second).mapTo[StatusOfImport]).onComplete {
case Success(s) => ctx.complete(s)
case Failure(x)=> ctx.complete(StatusCodes.RequestTimeout)
}
}