我有一个Play框架控制器方法,它返回一个Byte或一个基于请求头的字符串。如下所示:
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))
}
}它编译得很好。它的行为方式有何原因?
发布于 2014-02-24 15:26:46
这是因为getBytePayload(s)和s的返回类型不同。考虑一下更简单的例子:
val test = if (true) "1" else 0test值的类型将是Any。通常,Scala中的if-else生成值,该值的类型将是和语句的公共类型。
因此,考虑到Int类型层次结构如下所示:Int --> AnyVal --> Any和String类型层次结构如下所示:String --> AnyRef --> Any,它们的第一个常见类型是Any,在您的示例中,它似乎是一个Serializable
https://stackoverflow.com/questions/21991087
复制相似问题