我可以在喷雾中返回Future [Option [Foo]]吗?

时间:2014-02-23 15:37:23

标签: scala rest spray

到目前为止,我的尝试遇到了java.lang.ClassCastException: scala.runtime.BoxedUnit cannot be cast to scala.Option。事实上,我甚至无法想出适当的反应如何。有可能吗?

3 个答案:

答案 0 :(得分:6)

这可能有两个选项:要么是您程序中的错误,要么是您没有以任何方式提供喷涂来Foo类型,因为FutureOption由默认。例如,这条路线可由标准喷雾编组处理,没有任何问题:

val route = {
  (get & path("test")) {
    complete {
      Future(Option("Hello Spray!"))
    }
  }
}

现在,如果您在/ test上发出GET请求,您将得到正确的回复。

如果您有特定类型,那么您需要提供类型为ToResponseMarshallable的自己的编组器来通过隐式上下文进行搜索。我认为最常见和最简单的方法是制作一个Json响应,为此你需要一个spray-json(或其他一些支持的json lib)并且只需要为json提供一个转换器,如:

import spray.json.DefaultJsonProtocol._

case class Boy(name: String, age: String)
object Boy {
  implicit val boyJson = jsonFormat2(Boy.apply)
}

现在唯一要做的就是将json marshaller放入范围:

import spray.httpx.SprayJsonSupport._ // import json marshaller

val route = {
  (get & path("test") {
    complete {  
      Future(Option(Boy("Name", 0)))
    }
  }
}

现在你将获得一个json响应。如果您需要其他类型的响应,请为男孩类型制作自定义编组器。

答案 1 :(得分:1)

简而言之 - 是的,但你需要让编译器开心。

Spray允许您返回Future或简单响应,只要它可以编组回响应即可。您需要确保在范围内进行隐式转换,为您进行编组或明确转换Foo对象。

以下是响应转换的执行方式:http://spray.io/documentation/1.2.0/spray-httpx/response-transformation/

答案 2 :(得分:0)

对于仍然在完整块中返回未来问题的任何人,请确保在范围内有scala.concurrent.ExecutionContext.Implicits.global等执行上下文! IDE往往不明白这是问题,可能会让你陷入长长的兔子洞。