2016-08-12 63 views
7

我使用play2.5用java 8.我使用从CompletionStage获取值在Java中

WSRequest request = ws.url("http://abababa .com"); 
WSRequest complexRequest = request.setHeader("X-API-Key", "xxxxxx") 
      .setHeader("Content-Type", "application/x-www-form-urlencoded") 
CompletionStage<WSResponse> responsePromise = complexRequest.post("grant_type=password" 
      + "&username=xxxxx&password=yyyyy"); 
CompletionStage<JsonNode> jsonPromise = responsePromise.thenApply(WSResponse::asJson); 

如何打印响应的最终响应进行POST请求到服务器。我想返回部分响应给这个函数。与同步代码相比,调用此函数的函数是否也有不同的代码?

+0

'jsonPromise .get()'并等待结果? – Tunaki

+0

它的一个发布请求。 – raju

回答

2

问题是所有这些代码都是异步执行的。如果你确实想从方法返回结果,你将不得不阻止,直到你得到结果。阻挡不好,因为它会影响性能。通常,您希望按原样返回CompletionStage,并让调用方决定如何处理它。但是,如果您必须绝对返回结果,则示例代码如下所示。

WSRequest request = ws.url("http://abababa .com"); 
WSRequest complexRequest = request.setHeader("X-API-Key", "xxxxxx") 
     .setHeader("Content-Type", "application/x-www-form-urlencoded") 
CompletionStage<WSResponse> responsePromise = complexRequest.post("grant_type=password" 
     + "&username=xxxxx&password=yyyyy"); 
CompletionStage<JsonNode> jsonPromise = responsePromise.thenApply(WSResponse::asJson); 
Object waitGuard = new Object(); 
AtomicReference<JsonNode> resultReference = new AtomicReference(); 
synchronized(waitGuard){ 
    jsonPromise.thenAccept(jsonNode -> { 
    resultReference.set(jsonNode); 
    waitGuard.notify(); 
    }); 
    waitGuard.wait(); 
} 
return resultReference.get(); 
7

jsonPromise.toCompletableFuture().get()

0
JsonNode jsonData = jsonPromise.toCompletableFuture().get() 

我想上面的代码,但我得到的编译器错误,返回JsonNode数据,然后我用

JsonNode jsonData = jsonPromise.toCompletableFuture().join() 

,它工作正常