首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >播放框架异步响应错误

播放框架异步响应错误
EN

Stack Overflow用户
提问于 2014-02-24 14:49:35
回答 1查看 834关注 0票数 2

我有一个Play框架控制器方法,它返回一个Byte或一个基于请求头的字符串。如下所示:

代码语言:javascript
复制
  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中没有看到任何错误,但是当我编译它时,它会失败,并出现以下错误:

代码语言:javascript
复制
Cannot write an instance of java.io.Serializable to HTTP response. Try to define a Writeable[java.io.Serializable]

为什么会这样呢?但是,如果我将其修改为如下所示:

代码语言:javascript
复制
  Async {
    if(request.headers.toSimpleMap.exists(_ == (CONTENT_ENCODING, "gzip"))) {
      resultJsonfut.map(s => Ok(getBytePayload(s)))
    } else {
        resultJsonfut.map(s => Ok(s))
    }
  }

它编译得很好。它的行为方式有何原因?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-24 15:26:46

这是因为getBytePayload(s)s的返回类型不同。考虑一下更简单的例子:

代码语言:javascript
复制
val test = if (true) "1" else 0

test值的类型将是Any。通常,Scala中的if-else生成值,该值的类型将是语句的公共类型。

因此,考虑到Int类型层次结构如下所示:Int --> AnyVal --> AnyString类型层次结构如下所示:String --> AnyRef --> Any,它们的第一个常见类型是Any,在您的示例中,它似乎是一个Serializable

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21991087

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档