Play 2.5 upgrade error: CompletionException - There is no HTTP Context available from here
Play 2.5 upgrade error: CompletionException - There is no HTTP Context available from here
在示例应用程序上从 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: 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$$anonfun$apply.applyOrElse(PlayRequestHandler.scala:100)
at play.core.server.netty.PlayRequestHandler$$anonfun$$anonfun$apply.applyOrElse(PlayRequestHandler.scala:99)
at scala.concurrent.Future$$anonfun$recoverWith.apply(Future.scala:344)
at scala.concurrent.Future$$anonfun$recoverWith.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.apply(JavaController.java:107)
at controllers.JavaController.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 替换为之前 link 中建议的替换(反映在下面的更改片段中)。
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, I keep getting the no HTTP Context available
error above. I also get the same result with http://localhost:9000/java8/proxy
endpoint in the Java8Controller class 替换适当的替换调用后。
我发现其他人也遇到过这个问题,到目前为止我已经能够推测我需要一个 call and/or use ,尽管我一直无法将这些知识转移到这个例子中。也许有人可以举一两个(或三个)例子来说明我如何解决这个错误?欢迎任何建议,并提前感谢您。
根据 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());
}
}
希望对您有所帮助。
在示例应用程序上从 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: 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$$anonfun$apply.applyOrElse(PlayRequestHandler.scala:100)
at play.core.server.netty.PlayRequestHandler$$anonfun$$anonfun$apply.applyOrElse(PlayRequestHandler.scala:99)
at scala.concurrent.Future$$anonfun$recoverWith.apply(Future.scala:344)
at scala.concurrent.Future$$anonfun$recoverWith.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.apply(JavaController.java:107)
at controllers.JavaController.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 替换为之前 link 中建议的替换(反映在下面的更改片段中)。
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, I keep getting the no HTTP Context available
error above. I also get the same result with http://localhost:9000/java8/proxy
endpoint in the Java8Controller class 替换适当的替换调用后。
我发现其他人也遇到过这个问题,到目前为止我已经能够推测我需要一个 call and/or use
根据 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());
}
}
希望对您有所帮助。