ошибка несоответствия типов в директиве akka dsl route - PullRequest
2 голосов
/ 11 мая 2019

Я настраиваю контроллер покоя с помощью akka http. Контроллер анализирует URL, извлекает переменные, затем вызывает службу, которая отправляет сообщение субъекту, который затем запрашивает репозиторий и отправляет данные в виде сообщения. Я, наконец, получил актера, чтобы получить сообщение и запросить репозиторий (после того, как я должен был чередовать серию фьючерсов), но теперь у меня есть ошибка в контроллере, которую я не могу понять:

Error:(58, 41) type mismatch;
 found   : Unit
 required: akka.http.scaladsl.server.RequestContext => 
scala.concurrent.Future[akka.http.scaladsl.server.RouteResult]
path("process" / Segment) { process =>

Означает ли это, что я должен включить полный () в другом месте?

Я пытался убедиться, что субъект отправляет будущее в качестве содержимого своего сообщения и что служба возвращает будущее контроллеру, потому что я думал, что это единственный способ избежать нулевых указателей.

Это мои зависимости:

"com.typesafe.akka" %% "akka-http"   % "10.1.8",
"com.typesafe.akka" %% "akka-actor"  % "2.5.22",
"com.typesafe.akka" %% "akka-stream" % "2.5.22",
"com.typesafe.akka" %% "akka-http-spray-json" % "10.1.8"

Это контроллер покоя:

val processRoute =
path("process" / Segment) { process =>
  withoutRequestTimeout {
    parameters("userName", "limit") { (twitterUserName, limit) =>
      get {
        val processRequest: ProcessRequest = new ProcessRequest(twitterUserName, process, limit.toInt)
        import JsonSupport._
        process match {

          case "shout" =>
            val serviceResult // add more cases in future or call method dynamically
            = processService.shout(processRequest)
            var listOfTweetTexts: List[String] = List[String]()

            serviceResult onComplete {
              case Success(result) =>
                for (tweet <- result.tweets) listOfTweetTexts ::= tweet;
                complete(listOfTweetTexts)
              case Failure(t) =>
                actorSystem.log.error("An error has occurred: " + t.getMessage)
                complete(HttpEntity(ContentTypes.`text/html(UTF-8)`, "Say hello to failure"))

            }
          // complete(HttpEntity(ContentTypes.`text/html(UTF-8)`, "Say hello to" + limit))
          case _ => complete(HttpEntity(ContentTypes.`text/html(UTF-8)`, "Say hello to" + limit))
        }
        complete(HttpEntity(ContentTypes.`text/html(UTF-8)`, "Say hello to" + limit))
      }
    }
  }
}
}

1 Ответ

3 голосов
/ 11 мая 2019

Вы звоните onComplete на Future, который возвращает Unit.То, что вы хотите сделать, это использовать Akka onComplete на Future.

Так что это должно быть

onComplete(serviceResult) {

, а не

serviceResult onComplete {
...