Scala 播放框架异步响应错误

Scala 播放框架异步响应错误,scala,asynchronous,playframework,Scala,Asynchronous,Playframework,我有一个Play framework控制器方法,它根据请求头返回字节数组或字符串。下面是它的外观: def returnResponse = Action(parse.anyContent) { request => println(request.body) val buffer: RawBuffer = request.body.asRaw.get val js: String = buffer.asBytes() match {

我有一个Play framework控制器方法,它根据请求头返回字节数组或字符串。下面是它的外观:

  def returnResponse = Action(parse.anyContent) {
    request =>
      println(request.body)
      val buffer: RawBuffer = request.body.asRaw.get
      val js: String  = buffer.asBytes() match {
        case Some(x) => new String(x, "UTF-8")
        case None => scala.io.Source.fromFile(buffer.asFile).mkString
      }

      val resultJsonfut = scala.concurrent.Future { serviceCall.run(js) }

      Async {
        resultJsonfut.map(s => {
          val out = if(request.headers.toSimpleMap.exists(_ == (CONTENT_ENCODING, "gzip"))) getBytePayload(s) else s
          Ok(out)
        })
      }
  }
我在IntelliJ中没有看到任何错误,但是当我编译它时,它失败了,出现以下错误:

Cannot write an instance of java.io.Serializable to HTTP response. Try to define a Writeable[java.io.Serializable]
为什么呢?但是,如果我稍微修改一下,使其如下所示:

  Async {
    if(request.headers.toSimpleMap.exists(_ == (CONTENT_ENCODING, "gzip"))) {
      resultJsonfut.map(s => Ok(getBytePayload(s)))
    } else {
        resultJsonfut.map(s => Ok(s))
    }
  }

它编译得很好。有什么原因导致它这样做吗?

发生这种情况是因为
getBytePayload
s
的返回类型不同。 考虑简单的例子:

val test = if (true) "1" else 0
test
值的类型将是
Any
。 通常,Scala中的
if-else
会生成该值,该值的类型将是这两个语句的常见类型

因此,考虑到
Int
类型层次结构如下:
Int-->AnyVal-->Any
String
类型层次结构如下所示:
String-->AnyRef-->Any

它们的第一个常见类型是
Any
,在您的情况下,它似乎是一个
可序列化的

,因此在这种情况下,Any是不可序列化的,这就是它失败的原因!