2013-01-08 115 views
2

編譯時出現以下代碼錯誤。 我正在嘗試調用Web服務。Web服務調用Scala Play2錯誤

def authenticate(username: String, password: String): String = { 
    val request: Future[Response] = 
     WS.url(XXConstants.URL_GetTicket) 
      .withTimeout(5000) 
      .post(Map("username" -> Seq(username), "password" -> Seq(password)))    
     request map { response => 
     Ok(response.xml.text) 
     } recover { 
     case t: TimeoutException => 
      RequestTimeout(t.getMessage) 
     case e => 
      ServiceUnavailable(e.getMessage) 
     } 

} 

我看到以下編譯器錯誤:

type mismatch; found : scala.concurrent.Future[play.api.mvc.SimpleResult[String]] required: String 

回答

2

authenticate函數返回值是val request = ...Future[Response]類型,但該函數需要String其作爲編譯器說的是類型不匹配錯誤。將函數的返回類型更改爲Future[Response]或將request更改爲String,然後再返回它應該修復它。

2

就像說布賴恩,你當前返回Future[String],當你說你想要返回String

該請求返回Future,因爲它是異步調用。

所以,你有兩個選擇:

  1. 更改方法定義返回一個Future[String],而在另一種方法管理這個未來(與.map()

  2. 強制要求得到這樣的結果立即,以同步的方式。這不是一個很好的交易,但有時它是最簡單的解決方案。

    import scala.concurrent.Await 
    import scala.concurrent.duration.Duration 
    val response: String = Await.result(req, Duration.Inf)