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

eug*_*ied 1 rest scala spray

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

4le*_*x1v 6

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

val route = {
  (get & path("test")) {
    complete {
      Future(Option("Hello Spray!"))
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

现在,如果您在/ test上发出GET请求,您将获得正确的响应.

如果你有一个特定的类型,那么你需要提供你自己的类型marshaller 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)
}
Run Code Online (Sandbox Code Playgroud)

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

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

val route = {
  (get & path("test") {
    complete {  
      Future(Option(Boy("Name", 0)))
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

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