2013-02-19 2 views
49

che io chiamo un webservice come questo:Gioca Framework 2.1 - Non riesco a trovare un ExecutionContext implicita

WS 
    .url(url) 
    .get 
    .map { response => // error occurs on this line 
    response.status match { 
     case 200 => Right(response.json) 
     case status => Left(s"Problem accessing api, status '$status'") 
    } 
} 

L'errore completo: Error: Cannot find an implicit ExecutionContext, either require one yourself or import ExecutionContext.Implicits.global

risposta

115

Secondo this issue, è fissato nella documentazione. Avevo bisogno di aggiungere la seguente importazione:

import play.api.libs.concurrent.Execution.Implicits._ 
+7

Informazioni sul contesto di esecuzione. Alcune persone pensano che sia la stessa cosa del contesto globale di Scala. Tuttavia non lo è. [Execution.scala] (https://github.com/playframework/playframework/blob/2.2.x/framework/src/play/src/main/scala/play/api/libs/concurrent/Execution.scala) sta puntando su [Invoker.scala] (https://github.com/playframework/playframework/blob/2.2.x/framework/src/play/src/main/scala/play/core/system/Invoker.scala?source = cc) Quindi in realtà è il contesto di esecuzione del sistema di attori Play. Ciò consente di modificare il comportamento utilizzando application.conf – EECOLOR

+0

Il collegamento "Questo problema" è interrotto ora. C'è un archivio sul web.archive però: http://web.archive.org/web/20140222113140/http://play.lighthouseapp.com/projects/82401/tickets/899-error-cannot-find-an -implicit-executioncontext-both-require-one-yourself-or-import-executioncontextimplicitsglobal – EdgeCaseBerg

+0

@EdgeCaseBerg Grazie, ho modificato il link – EECOLOR

-1

Un'opzione alternativa:

import scala.concurrent.ExecutionContext.Implicits.global 
+0

Si prega di vedere il mio commento sulla domanda di voto su questo contesto di esecuzione. – EECOLOR

1

Dal Gioco 2.4 è possibile iniettare predefinita execution context via Guice dipendenza: l'iniezione.

class Foo @Inject()()(implicit ec:ExecutionContext) { 

def bar() = { 
    WS.url(url) 
    .get 
    .map { response => // error occurs on this line 
     response.status match { 
     case 200 => Right(response.json) 
     case status => Left(s"Problem accessing api, status '$status'") 
    } 
    } 
} 
+0

Il tuo codice non inserisce il contesto di esecuzione. Usa ancora la risoluzione implicita per ottenere il contesto di esecuzione. – EECOLOR

+0

Come da documentazione di Play (almeno 2.6), la risposta di @ mgosk è lo standard; vedi: https://www.playframework.com/documentation/2.6.x/ThreadPools#Using-the-default-thread-pool – juanmirocks

+0

C'è, tuttavia, molto di più. Puoi anche estendere/definire 'CustomExecutionContext'. Vedi: https://www.playframework.com/documentation/2.6.x/Migration26#play.api.libs.concurrent.Execution-is-deprecated e https://www.playframework.com/documentation/2.6.x/ Highlights26 # CustomExecutionContext-e-thread-Pool-Dimensionamento – juanmirocks