1

如何配置 spring 以使用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使用 spring (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(转换结果)
    • 最后,我将转换列表调用为 Completable,如此所述。

看来未来转型是错误的。会不会是未来的连锁经营太长了?有任何想法吗?

4

1 回答 1

0

问题出在这一行:

@RequestMapping(path = "/" ...

什么时候改成

@RequestMapping(path = "/1" ...

未来的完成突然变成了工作。

PS我之前已经打破了所有的想法,才发现问题实际上在映射中。可能对某人有帮助 O:-)

于 2015-09-14T15:44:00.237 回答