空指针异常(未解决)和 Unable to map WSResponse to Result in play 2.4(这部分已解决。我猜)

Null Pointer Exception(not solved) and Unable to map WSResponse to Result in play 2.4 (this part solved. i guess)

我正在尝试用 Play2.4 编写一个简单的应用程序。我想获取一个页面并将其显示在我的本地主机上,该主机将充当代理。以下是我在控制器中的操作:

public class Proxy extends Controller{
    @Inject WSClient ws;

    public Promise<Result> index(String url){
        WSRequest request = ws.url(url);
        //Promise<WSResponse> responsePromise = request.get();
        return Promise.promise(() -> request.get())
                .map((WSResponse wsresponse) -> ok(wsresponse.getBody()).as("text/html"));
    }
}

我遇到错误 no suitable method found for map((WSRespons[...]tml"))。我对 Play 和 Java8 都很陌生。你能帮我解决这个问题,或者给我指明正确的方向吗?

此外,我们应该使用 WSResponse 还是只使用 Response。这些方面的文档非常稀缺。

我基本上希望以上任务异步完成。谢谢

PS:我一直在关注这个linkhttps://www.playframework.com/documentation/2.4.x/JavaAsync and https://www.playframework.com/documentation/2.3.x/JavaAsync

PPS。正如@MonCalamari 在评论中所建议的那样,我确实使用了 return request.get().map((r) -> ok(r.getBody()).as("text/html")); 但是现在我得到一个奇怪的

Execution exception
[NullPointerException: scheme]

return request.get().map((r) -> ok(r.getBody()).as("text/html"));

我也尝试浏览文档和其他来源,但都无济于事。任何帮助,将不胜感激。谢谢

无法得到任何答案...通过堆栈跟踪但无法得到任何信息...如果有人感兴趣,下面是堆栈跟踪。

play.api.http.HttpErrorHandlerExceptions$$anon: Execution exception[[NullPointerException: scheme]]
    at play.api.http.HttpErrorHandlerExceptions$.throwableToUsefulException(HttpErrorHandler.scala:254) ~[play_2.11-2.4.0.jar:2.4.0]
    at play.api.http.DefaultHttpErrorHandler.onServerError(HttpErrorHandler.scala:180) ~[play_2.11-2.4.0.jar:2.4.0]
    at play.api.GlobalSettings$class.onError(GlobalSettings.scala:179) [play_2.11-2.4.0.jar:2.4.0]
    at play.api.DefaultGlobal$.onError(GlobalSettings.scala:212) [play_2.11-2.4.0.jar:2.4.0]
    at play.api.http.GlobalSettingsHttpErrorHandler.onServerError(HttpErrorHandler.scala:94) [play_2.11-2.4.0.jar:2.4.0]
    at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$$anonfun$apply.applyOrElse(PlayDefaultUpstreamHandler.scala:158) [play-netty-server_2.11-2.4.0.jar:2.4.0]
    at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$$anonfun$apply.applyOrElse(PlayDefaultUpstreamHandler.scala:155) [play-netty-server_2.11-2.4.0.jar:2.4.0]
    at scala.runtime.AbstractPartialFunction.apply(AbstractPartialFunction.scala:36) [scala-library-2.11.6.jar:na]
    at scala.util.Failure$$anonfun$recover.apply(Try.scala:215) [scala-library-2.11.6.jar:na]
    at scala.util.Try$.apply(Try.scala:191) [scala-library-2.11.6.jar:na]
    at scala.util.Failure.recover(Try.scala:215) [scala-library-2.11.6.jar:na]
    at scala.concurrent.Future$$anonfun$recover.apply(Future.scala:324) [scala-library-2.11.6.jar:na]
    at scala.concurrent.Future$$anonfun$recover.apply(Future.scala:324) [scala-library-2.11.6.jar:na]
    at scala.concurrent.impl.CallbackRunnable.run(Promise.scala:32) [scala-library-2.11.6.jar:na]
    at play.api.libs.iteratee.Execution$trampoline$.executeScheduled(Execution.scala:109) [play-iteratees_2.11-2.4.0.jar:2.4.0]
    at play.api.libs.iteratee.Execution$trampoline$.execute(Execution.scala:71) [play-iteratees_2.11-2.4.0.jar:2.4.0]
    at scala.concurrent.impl.CallbackRunnable.executeWithValue(Promise.scala:40) [scala-library-2.11.6.jar:na]
    at scala.concurrent.impl.Promise$DefaultPromise.tryComplete(Promise.scala:248) [scala-library-2.11.6.jar:na]
    at scala.concurrent.Promise$class.complete(Promise.scala:55) [scala-library-2.11.6.jar:na]
    at scala.concurrent.impl.Promise$DefaultPromise.complete(Promise.scala:153) [scala-library-2.11.6.jar:na]
    at scala.concurrent.impl.Future$PromiseCompletingRunnable.run(Future.scala:23) [scala-library-2.11.6.jar:na]
    at akka.dispatch.TaskInvocation.run(AbstractDispatcher.scala:40) [akka-actor_2.11-2.3.11.jar:na]
    at akka.dispatch.ForkJoinExecutorConfigurator$AkkaForkJoinTask.exec(AbstractDispatcher.scala:397) [akka-actor_2.11-2.3.11.jar:na]
    at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260) [scala-library-2.11.6.jar:na]
    at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339) [scala-library-2.11.6.jar:na]
    at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979) [scala-library-2.11.6.jar:na]
    at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107) [scala-library-2.11.6.jar:na]
Caused by: java.lang.NullPointerException: scheme
    at com.ning.http.client.uri.Uri.<init>(Uri.java:56) ~[async-http-client-1.9.21.jar:na]
    at com.ning.http.client.uri.Uri.create(Uri.java:32) ~[async-http-client-1.9.21.jar:na]
    at com.ning.http.client.uri.Uri.create(Uri.java:25) ~[async-http-client-1.9.21.jar:na]
    at com.ning.http.client.RequestBuilderBase.setUrl(RequestBuilderBase.java:307) ~[async-http-client-1.9.21.jar:na]
    at com.ning.http.client.RequestBuilder.setUrl(RequestBuilder.java:165) ~[async-http-client-1.9.21.jar:na]
    at play.libs.ws.ning.NingWSRequest.buildRequest(NingWSRequest.java:401) ~[play-java-ws_2.11-2.4.0.jar:2.4.0]
    at play.libs.ws.ning.NingWSRequest.execute(NingWSRequest.java:394) ~[play-java-ws_2.11-2.4.0.jar:2.4.0]
    at play.libs.ws.ning.NingWSRequest.execute(NingWSRequest.java:389) ~[play-java-ws_2.11-2.4.0.jar:2.4.0]
    at play.libs.ws.ning.NingWSRequest.get(NingWSRequest.java:272) ~[play-java-ws_2.11-2.4.0.jar:2.4.0]
    at controllers.Proxy.index(Proxy.java:46) ~[classes/:2.4.0]
    at router.Routes$$anonfun$routes$$anonfun$applyOrElse$$anonfun$apply.apply(Routes.scala:157) ~[classes/:na]
    at router.Routes$$anonfun$routes$$anonfun$applyOrElse$$anonfun$apply.apply(Routes.scala:157) ~[classes/:na]
    at play.core.routing.HandlerInvokerFactory$$anon.resultCall(HandlerInvoker.scala:139) ~[play_2.11-2.4.0.jar:2.4.0]
    at play.core.routing.HandlerInvokerFactory$JavaActionInvokerFactory$$anon$$anon$$anon.invocation(HandlerInvoker.scala:127) ~[play_2.11-2.4.0.jar:2.4.0]
    at play.core.j.JavaAction$$anon.call(JavaAction.scala:65) ~[play_2.11-2.4.0.jar:2.4.0]
    at play.http.DefaultHttpRequestHandler.call(DefaultHttpRequestHandler.java:20) ~[play_2.11-2.4.0.jar:2.4.0]
    at play.core.j.JavaAction$$anonfun.apply(JavaAction.scala:85) ~[play_2.11-2.4.0.jar:2.4.0]
    at play.core.j.JavaAction$$anonfun.apply(JavaAction.scala:85) ~[play_2.11-2.4.0.jar:2.4.0]
    at scala.concurrent.impl.Future$PromiseCompletingRunnable.liftedTree1(Future.scala:24) [scala-library-2.11.6.jar:na]
    at scala.concurrent.impl.Future$PromiseCompletingRunnable.run(Future.scala:24) [scala-library-2.11.6.jar:na]
    at play.core.j.HttpExecutionContext$$anon.run(HttpExecutionContext.scala:40) ~[play_2.11-2.4.0.jar:2.4.0]
    at play.api.libs.iteratee.Execution$trampoline$.execute(Execution.scala:70) [play-iteratees_2.11-2.4.0.jar:2.4.0]
    at play.core.j.HttpExecutionContext.execute(HttpExecutionContext.scala:32) ~[play_2.11-2.4.0.jar:2.4.0]
    at scala.concurrent.impl.Future$.apply(Future.scala:31) ~[scala-library-2.11.6.jar:na]
    at scala.concurrent.Future$.apply(Future.scala:492) ~[scala-library-2.11.6.jar:na]
    at play.core.j.JavaAction.apply(JavaAction.scala:85) ~[play_2.11-2.4.0.jar:2.4.0]
    at play.api.mvc.Action$$anonfun$apply$$anonfun$apply$$anonfun$apply.apply(Action.scala:105) ~[play_2.11-2.4.0.jar:2.4.0]
    at play.api.mvc.Action$$anonfun$apply$$anonfun$apply$$anonfun$apply.apply(Action.scala:105) ~[play_2.11-2.4.0.jar:2.4.0]
    at play.utils.Threads$.withContextClassLoader(Threads.scala:21) ~[play_2.11-2.4.0.jar:2.4.0]
    at play.api.mvc.Action$$anonfun$apply$$anonfun$apply.apply(Action.scala:104) ~[play_2.11-2.4.0.jar:2.4.0]
    at play.api.mvc.Action$$anonfun$apply$$anonfun$apply.apply(Action.scala:103) ~[play_2.11-2.4.0.jar:2.4.0]
    at scala.Option.map(Option.scala:146) ~[scala-library-2.11.6.jar:na]
    at play.api.mvc.Action$$anonfun$apply.apply(Action.scala:103) ~[play_2.11-2.4.0.jar:2.4.0]
    at play.api.mvc.Action$$anonfun$apply.apply(Action.scala:96) ~[play_2.11-2.4.0.jar:2.4.0]
    at play.api.libs.iteratee.Iteratee$$anonfun$mapM.apply(Iteratee.scala:524) ~[play-iteratees_2.11-2.4.0.jar:2.4.0]
    at play.api.libs.iteratee.Iteratee$$anonfun$mapM.apply(Iteratee.scala:524) ~[play-iteratees_2.11-2.4.0.jar:2.4.0]
    at play.api.libs.iteratee.Iteratee$$anonfun$flatMapM.apply(Iteratee.scala:560) ~[play-iteratees_2.11-2.4.0.jar:2.4.0]
    at play.api.libs.iteratee.Iteratee$$anonfun$flatMapM.apply(Iteratee.scala:560) ~[play-iteratees_2.11-2.4.0.jar:2.4.0]
    at play.api.libs.iteratee.Iteratee$$anonfun$flatMap$$anonfun$apply.apply(Iteratee.scala:536) ~[play-iteratees_2.11-2.4.0.jar:2.4.0]
    at play.api.libs.iteratee.Iteratee$$anonfun$flatMap$$anonfun$apply.apply(Iteratee.scala:536) ~[play-iteratees_2.11-2.4.0.jar:2.4.0]
    at scala.concurrent.impl.Future$PromiseCompletingRunnable.liftedTree1(Future.scala:24) [scala-library-2.11.6.jar:na]
    at scala.concurrent.impl.Future$PromiseCompletingRunnable.run(Future.scala:24) [scala-library-2.11.6.jar:na]
    ... 6 common frames omitted

问题的第二部分由@Mon回答 Calamari.WE 需要使用 return request.get().map((r) -> ok(r.getBody()).as("text/html")); 。至于第一部分,问题是2部分。

检查我们是否有有效的url。有很多方法可以做到这一点。我用以下简单的方法做了。

try {
    URL url = new URL("http://www.yoursite.com/");
    URLConnection conn = url.openConnection();
    conn.connect();
} catch (MalformedURLException e) {
    // the URL is not in a valid form
} catch (IOException e) {
    // the connection couldn't be established
}

然后,罪魁祸首就在我的 routes 文件中。

GET     /proxy/:url         controllers.Proxy.index(url:String) 
GET     /proxy               controllers.Proxy.index(url:String)

第一个导致错误。我将其替换为第二行中显示的查询参数,一切正常。