我有一个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))
}
}
编译好。它出现这种情况的原因是什么?
答案 0 :(得分:1)
这是因为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