2014-02-24 99 views
2

我有一個播放框架控制器方法,根據請求標頭返回一個字節數組或字符串。這裏是什麼樣子:播放框架異步響應錯誤

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)) 
    } 
    } 

它編譯得很好。任何理由爲什麼這樣表現?

回答

1

發生這種情況是因爲返回類型getBytePayload(s)s是不同的。 考慮simplier例如:

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

類型test值將是Any。 一般來說,斯卡拉的if-else產生的值和這個值的類型將是這兩個報表的常見類型。

所以考慮Int類型層次結構是這樣的:Int --> AnyVal --> AnyString類型層次結構是這樣的:String --> AnyRef --> Any 爲他們的第一個常見的類型是Any對你來說這似乎是一個Serializable

+0

所以在這種情況下任何不是可序列化的,並且它爲什麼失敗的原因! – sparkr