2016-08-12 15 views
7

に私は応答の最終応答を印刷するにはどうすればよい取得値は、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リクエストを作っていたJava 8でplay2.5を使用しています。私はこの関数に応答の一部を返したいと思います。この関数を呼び出した関数も、同期コードと比較して異なるコードを持つべきですか?

+0

'jsonPromiseを働き、JsonNodeデータを返すために、私は上記のコードを試してみましたが、私は、コンパイラのエラーを取得します.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 jsonData = jsonPromise.toCompletableFuture().join() 

を使用し、それがうまく

関連する問題