2016-08-12 60 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() 

,它工作正常