2014-02-24 2 views
2

요청 헤더를 기반으로 바이트 배열 또는 문자열을 반환하는 Play 프레임 워크 컨트롤러 메서드가 있습니다. 여기가 모습입니다 :Play Framework 비동기 응답 오류

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이기 때문에 이러한 현상이 발생합니다. 더 간단 예를 고려

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

test 값의 유형은 Any 것이다. 일반적으로 스칼라의 if-else은 값을 생성하며이 값의 유형은 모두 문에 대한 일반적인 유형이됩니다.

그래서 Int 유형 계층을 고려은 다음과 같습니다 Int --> AnyVal --> AnyString 유형 계층 구조는 다음과 같습니다 String --> AnyRef --> Any 그들에 대한 최초의 일반적인 유형 Any이며, 귀하의 경우는 그래서에서 Serializable

+0

것 같다 그 경우 Any는 Serializable이 아니며 처음에 실패한 이유입니다! – sparkr

관련 문제