繁体   English   中英

播放框架异步响应错误

[英]Play Framework Async Response Error

我有一个Play框架控制器方法,该方法基于请求标头返回字节数组或字符串。 看起来像这样:

  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)s的返回类型不同。 考虑以下简单示例:

val test = if (true) "1" else 0

test值的类型将为Any 通常,Scala中的if-else会生成值,并且该值的类型将是两个语句的通用类型。

因此,考虑到Int类型层次结构是这样的: Int --> AnyVal --> Any ,而String类型层次结构看起来是这样的: String --> AnyRef --> Any的第一个通用类型是Any ,在您的情况下是似乎是可Serializable

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM