[英]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.