2017-01-12 6 views
3

После обновления с Play 2.4 до Play 2.5 на образце приложения, когда я запускаю ./activator clean dist, я не получаю ошибок, но после перехода к определенной конечной точке http://localhost:9000/java/proxy, I «м получает следующее сообщение об ошибке:Ошибка при воспроизведении 2.5: CompletionException - здесь нет HTTP-контекста

[error] application - 

! @72keog237 - Internal server error, for (GET) [/java/proxy] -> 

play.api.http.HttpErrorHandlerExceptions$$anon$1: Execution exception[[CompletionException: java.lang.RuntimeException: There is no HTTP Context available from here.]] 
    at play.api.http.HttpErrorHandlerExceptions$.throwableToUsefulException(HttpErrorHandler.scala:293) 
    at play.api.http.DefaultHttpErrorHandler.onServerError(HttpErrorHandler.scala:220) 
    at play.api.GlobalSettings$class.onError(GlobalSettings.scala:160) 
    at play.api.DefaultGlobal$.onError(GlobalSettings.scala:188) 
    at play.api.http.GlobalSettingsHttpErrorHandler.onServerError(HttpErrorHandler.scala:100) 
    at play.core.server.netty.PlayRequestHandler$$anonfun$2$$anonfun$apply$1.applyOrElse(PlayRequestHandler.scala:100) 
    at play.core.server.netty.PlayRequestHandler$$anonfun$2$$anonfun$apply$1.applyOrElse(PlayRequestHandler.scala:99) 
    at scala.concurrent.Future$$anonfun$recoverWith$1.apply(Future.scala:344) 
    at scala.concurrent.Future$$anonfun$recoverWith$1.apply(Future.scala:343) 
    at scala.concurrent.impl.CallbackRunnable.run(Promise.scala:32) 
Caused by: java.util.concurrent.CompletionException: java.lang.RuntimeException: There is no HTTP Context available from here. 
    at java.util.concurrent.CompletableFuture.encodeThrowable(CompletableFuture.java:273) 
    at java.util.concurrent.CompletableFuture.completeThrowable(CompletableFuture.java:280) 
    at java.util.concurrent.CompletableFuture.uniApply(CompletableFuture.java:604) 
    at java.util.concurrent.CompletableFuture$UniApply.tryFire(CompletableFuture.java:577) 
    ... 5 common frames omitted 
Caused by: java.lang.RuntimeException: There is no HTTP Context available from here. 
    at play.mvc.Http$Context.current(Http.java:62) 
    at play.mvc.Controller.response(Controller.java:81) 
    at controllers.JavaController$4.apply(JavaController.java:107) 
    at controllers.JavaController$4.apply(JavaController.java:103) 
    at java.util.concurrent.CompletableFuture.uniApply(CompletableFuture.java:602) 
    at java.util.concurrent.CompletableFuture$UniApply.tryFire(CompletableFuture.java:577) 
    at java.util.concurrent.CompletableFuture$Completion.exec(CompletableFuture.java:443) 
    at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289) 
    at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1056) 
    at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1692) 

Я использовал направляющую от Replaced F.Promise with Java 8's CompletionStage заменяющего F.Promise, карту и flatMap с предложенными заменами от предыдущей линии связи (отражение изменений фрагмента ниже).

public CompletionStage<Result> proxy() { 
    final CompletionStage<WSResponse> responsePromise = WS.url("http://example.com").get(); 

    Logger.info("Before map"); 
    final CompletionStage<Result> resultPromise = responsePromise.thenApplyAsync(
     new Function<WSResponse, Result>() { 
      @Override 
      public Result apply(WSResponse wsResponse) { 
      Logger.info("Within map"); 
      response().setContentType(wsResponse.getHeader("Content-Type")); 
      return ok(wsResponse.getBody()); 
      } 
     } 
    ); 

При переходе обратно на 2.4, я не получаю эту ошибку и http://localhost:9000/java/proxy конечная точка успешно работает.

После замены соответствующих вызовов замены в методе proxy с использованием этого public sample app on github, я продолжаю получать ошибку no HTTP Context available. Я также получаю тот же результат с конечной точкой http://localhost:9000/java8/proxy в Java8Controller class.

Я нашел других, которые столкнулись с этой проблемой, и до сих пор я мог предположить, что мне нужен звонок HttpExecutionContext и/или использовать supplyAsync, хотя у меня возникли проблемы с передачей этих знаний в этот пример. Возможно, кто-то может привести пример или два (или три) о том, как я могу разрешить эту ошибку? Любые предложения приветствуются, и спасибо заранее.

ответ

8

В соответствии с Play Documentation, вы должны предоставить контекст выполнения HTTP явно в качестве исполнителя при использовании Java CompletionStage внутри Action. Таким образом, вы можете вводить контекст HTTP в своем действии.

public class Application extends Controller { 
@Inject HttpExecutionContext ec; 

public CompletionStage<Result> index() { 
    someCompletableFuture.supplyAsync(() -> { 
     // do something with request() 
    }, ec.current()); 
    } 
} 

Надеюсь, что это поможет.