1

CompletionStage戻り値の型で動作するように春を構成するにはどうすればよいですか? コードを考えてみましょう:

@RequestMapping(path = "/", params = "p", produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public CompletionStage<List<MyResult>> search(@RequestParam("p") String p) {
    CompletionStage<List<MyResult>> results = ...
    return results;
}

404 になりましたが、メソッドがトリガーされたことがログに表示されます。そのように署名を変更すると:

@RequestMapping(path = "/", params = "p", produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public List<MyResult> search(@RequestParam("p") String p) {
    CompletionStage<List<MyResult>> results = ...
    return results.get();
}

成功したjson配列が表示されます。

春の作品の作り方CompletionStage(4.2.RELEASE)は?

更新しました

テストのために、次のメソッドを作成しました。

@RequestMapping(path = "/async")
@ResponseBody
public CompletableFuture<List<MyResult>> async() {
    return CompletableFuture.completedFuture(Arrays.asList(new MyResult("John"), new MyResult("Bob")));
}

そして、それは機能します。うーん

私は将来のこのバージョンをテストしました:

@RequestMapping(path = "/async2")
@ResponseBody
public CompletableFuture<List<MyResult>> async2() {
    AsyncRestTemplate template = new AsyncRestTemplate();
    //simulate delay future with execution delay, you can change url to another one
    return toCompletable(template.getForEntity("https://www.google.ru/?gws_rd=ssl#q=1234567890-", String.class))
            .thenApply(
                    resp -> template.getForEntity("https://www.google.ru/?gws_rd=ssl#q=1234567890-", String.class))
            .thenApply(
                    resp -> template.getForEntity("https://www.google.ru/?gws_rd=ssl#q=1234567890-", String.class))
            .thenApply(
                    resp -> template.getForEntity("https://www.google.ru/?gws_rd=ssl#q=1234567890-", String.class))
            .thenApply(
                    resp -> template.getForEntity("https://www.google.ru/?gws_rd=ssl#q=1234567890-", String.class))
            .thenApply(
                    resp -> template.getForEntity("https://www.google.ru/?gws_rd=ssl#q=1234567890-", String.class))
            .thenApply(resp -> Arrays.asList(new MyResult("John"), new MyResult("Bob")));
}

少しアグリーですが...うまくいきます!

したがって、私の元の方法には次のロジックがあります。

  1. コレクションを繰り返す
  2. コレクション要素ごとに AsyncRestTemplate を介して非同期呼び出しを行う
  3. コレクション内の各 CompletableFuture を呼び出す
    • thenApply(変換結果)
    • thenCompose(AsyncRestTemplate で新しい非同期呼び出しを行います)
    • thenApply(変換結果)
    • 最後に、ここで説明されているように、transform List を Completable に呼び出します。

フューチャートランスフォーメーションが間違っているようです。将来のチェーンが長すぎる可能性はありますか? 何か案は?

4

1 に答える 1