【问题标题】:Play 2.5 upgrade error: CompletionException - There is no HTTP Context available from here [duplicate]Play 2.5 升级错误:CompletionException - 此处没有可用的 HTTP 上下文 [重复]
【发布时间】:2017-05-27 06:49:38
【问题描述】:

在示例应用上从 Play 2.4 升级到 Play 2.5 后,当我运行 ./activator clean dist 时,我没有收到任何错误,但是在转到特定端点 http://localhost:9000/java/proxy 后,我收到以下错误:

[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、map 和 flatMap 替换为上一个链接中建议的替换项(反映了以下更改的 sn-p)。

  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 端点工作成功。

使用此public sample app on github 替换proxy 方法中的适当替换调用后,我不断收到上面的no HTTP Context available 错误。我在Java8Controller class 中使用http://localhost:9000/java8/proxy 端点也得到了相同的结果。

我发现其他人遇到了这个问题,到目前为止,我已经能够推测我需要一个 HttpExecutionContext 呼叫和/或使用 supplyAsync,尽管我一直无法将这些知识转移到这个例子中.也许有人可以举一两个(或三个)关于我如何解决这个错误的例子?欢迎任何建议,并提前感谢您。

【问题讨论】:

    标签: java scala java-8 akka playframework-2.5


    【解决方案1】:

    根据Play Documentation,在Action 中使用Java CompletionStage 时,您必须明确提供HTTP 执行上下文作为执行程序。 因此,您可以在 Action 中注入 HTTP 上下文。

    public class Application extends Controller {
    @Inject HttpExecutionContext ec;
    
    public CompletionStage<Result> index() {
        someCompletableFuture.supplyAsync(() -> { 
          // do something with request()
        }, ec.current());
      }
    }
    

    希望对您有所帮助。

    【讨论】:

      猜你喜欢
      • 2016-07-14
      • 1970-01-01
      • 2020-11-28
      • 1970-01-01
      • 2014-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-22
      相关资源
      最近更新 更多