当前位置: 首页 > 知识库问答 >
问题:

akka dsl路由指令中的类型不匹配错误

欧阳声
2023-03-14

我正在使用akka超文本传输协议设置一个rest控制器。控制器解析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"

这是Rest控制器:

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个答案

南宫泓
2023-03-14

您正在对返回< code>Unit的< code>Future调用< code>onComplete。你要做的是在< code>Future上使用Akka onComplete

所以它应该是

onComplete(serviceResult) {

而不是

serviceResult onComplete {
 类似资料:
  • Tango支持4种形式的路由匹配规则 静态路由 tg.Get("/", new(Action)) tg.Get("/static", new(Action))匹配 URL:/ 到 Action结构体的Get函数 匹配 URL:/static 到 Action结构体的Get函数 命名路由 tg.Get("/:name", new(Action)) tg.Get("/(:name)", new(Act

  • 我有以下具有以下方法的类。 GsonHelper为我提供了一些 在Java 7之前,我一直使用这种方法,例如: 这工作得很好。因为这个方法会返回一个布尔值,我可以在“if”中使用它。但是当我换到Java 8时,这就不可能了。编译器抱怨: 类型不匹配:无法从对象转换为布尔值 我知道java.lang.Boolean可以为空。我可以通过以下方式解决这个问题: 但我很好奇,为什么这在Java 7中有效,

  • 错误:java.io.ioException:错误值类:类org.apache.hadoop.io.text不是类org.apache.hadoop.mapred.ifile$writer.append(ifile.java:194)在org.apache.hadoop.mapred.task$combineoutputCollector.collect(task.java:1350)在org.a

  • 问题内容: 我试图在Swift中使用JSONDecoder将JSON转换为Structs,所以我编写了所有Structs,将它们修改了几个小时,但它仍然给我这个错误。我不知道是否有办法查看给出此信息的行。我将在下面发布我的struct,并在其后发布Json File链接。 完整的错误描述是: typeMismatch(Swift.Dictionary ,Swift.DecodingError.Co

  • 英文原文: http://emberjs.com/guides/routing/specifying-a-routes-model/ 指定路由的模型 应用中的模板背后是由模型来支撑的。那么模板是如何知道需要显示哪些模型的呢? 例如,如果有一个photos模板,那么它是如何知道应该渲染哪一个模型的呢? 这正是Ember.Route的工作之一。通过定义一个与模板同名的,并实现其model方法的路由,是

  • 注意:本部分是为v1 API编写的,但这些概念也适用于v2 API。它将在未来版本的v2 API中重新描述。 Envoy的路由匹配过程如下: HTTP请求的头域字段 host 或 :authority 与虚拟主机匹配。 按顺序检查虚拟主机中的每个路由表。如果匹配,则使用该路由并且不再匹配路由。 独立地,依次检查虚拟主机中的每个虚拟集群。如果匹配,则使用虚拟群集,不再进一步匹配集群。 返回 上一级