2013-02-19 4 views
49

Wołam usługa tak:Zagraj Framework 2.1 - nie można odnaleźć ukrytą ExecutionContext

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

Kompletny błąd: Error: Cannot find an implicit ExecutionContext, either require one yourself or import ExecutionContext.Implicits.global

Odpowiedz

115

Według this issue, jest ona ustalana w dokumentacji. Musiałem dodać następujące import:

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

Informacje o kontekście wykonania. Niektórzy uważają, że jest to to samo, co globalny kontekst Scali. Jednak tak nie jest. [Execution.scala] (https://github.com/playframework/playframework/blob/2.2.x/framework/src/play/src/main/scala/play/api/libs/concurrent/Execution.scala) wskazuje [Invoker.scala] (https://github.com/playframework/playframework/blob/2.2.x/framework/src/play/src/main/scala/play/core/system/Invoker.scala?source = cc) Tak naprawdę jest to kontekst wykonania systemu Play Play. Pozwala to zmienić zachowanie za pomocą pliku application.conf – EECOLOR

+0

Link "Ten problem" jest teraz zepsuty. W Internecie jest archiwum. Jednakowoż: http://web.archive.org/web/20140222113140/http://play.lighthouseapp.com/projects/82401/tickets/899-error-cannot-find-an -implicit-executioncontextext-albo-require-one-yourself-or-import-executioncontextimplicitsglobal – EdgeCaseBerg

+0

@EdgeCaseBerg Dziękuję, poprawiłem link – EECOLOR

-1

alternatywną opcją:

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

Proszę zobaczyć mój komentarz dotyczący przegłosowanego pytania dotyczącego tego kontekstu wykonania. – EECOLOR

1

Od zagraj 2.4 można wstrzyknąć domyślne execution context poprzez zależność Guice: zastrzyk.

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

Twój kod nie wstrzykuje kontekstu wykonania. Nadal używa domyślnej rozdzielczości, aby uzyskać kontekst wykonania. – EECOLOR

+0

Zgodnie z dokumentacją Play (przynajmniej 2.6), odpowiedź @ mgosk jest standardem; zobacz: https://www.playframework.com/documentation/2.6.x/ThreadPools#Using-the-default-thread-pool – juanmirocks

+0

Jest jednak coś więcej. Możesz również rozszerzyć/zdefiniować 'CustomExecutionContext'. Zobacz: https://www.playframework.com/documentation/2.6.x/Migration26#play.api.libs.concurrent.Execution-is-deprecated i https://www.playframework.com/documentation/2.6.x/ Highlights26 # CustomExecutionContext-and-Thread-Pool-Sizing – juanmirocks