当前位置: 首页 > 知识库问答 >
问题:

如何处理spring的CompletionStage?

雍宇定
2023-03-14

如何配置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")));
}

而且很有效。面向对象

我测试了这个版本的future:

@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")));
}

有点激动,但是。。。作品

所以我原来的方法有以下逻辑:

  • 迭代集合
  • 通过每个集合元素的AsyncRestTemboard进行异步调用
  • 调用集合中的每个完全未来
    • thenApply(转换结果)
    • thenComment(使用AsyncRestTemboard进行新的异步调用)
    • thenApply(转换结果)
    • 最后,我将列表转换为完成列表,如这里所述。

    看来,未来的转型是错误的。会不会是未来的链条太长了?有什么想法吗?

共有1个答案

颜文康
2023-03-14

问题就在这一行:

@RequestMapping(path = "/" ...

什么时候改成的

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

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

顺便说一句,我在发现问题其实出在地图上之前已经心碎了。可能对某人有帮助O:-)

 类似资料:
  • 问题内容: 我需要在Spring 3.0应用程序中显示自定义消息。我有一个带有Hibernate的数据库,并且有几个约束。我对如何妥善处理存有疑问。我想知道是否有一种方法可以将异常映射到属性文件中的消息集,因为可以在约束验证中进行。我可以以任何方式自动处理它,还是必须在每个控制器中捕获此异常? 问题答案: 在违反约束的情况下显示用户友好消息的问题是,当将Hibernate的转换为Spring的时,

  • 如何处理? 在spring security中,当未找到用户名时,实现抛出。例如如下所示: 我想建立一个自定义的“用户未找到REST响应”。我应该如何捕获/处理此异常?我在WebSecurityConfigurerAdapter实现中实现了一个处理程序方法处理程序: 但是该方法应该等待异常,在运行时,该异常的类型是,因此我无法强制转换或检索初始的。 如有任何建议将不胜感激。很多很多问候:)。

  • 我做了一个像这个样例一样的项目。所以控制器是这样的 我喜欢处理所有的可抛物,并做出我定制的统一响应。问题是我找不到一个指南或样本来正确地做这件事。 我搜索了这个错误,发现了这个错误,我没有在我的项目中使用,因为我提供了上面的示例。所以我一无所知。主要的问题是如何处理所有的可抛物,但是如果您能给我一些关于如何解决问题的建议,我将非常感激。

  • 我对此做了一些研究,但结果相互矛盾。为了处理这个错误,有人说我需要在我的一个控制器中实现。 以下是一些链接: 如何处理MaxUploadSizeExceededExc的异常 使用Spring MVC处理MaxUploadSizeExceededExc的异常 http://www.raistudies.com/spring/spring-mvc/file-upload-spring-mvc-anno

  • 我知道使用spring boot,您不需要打开和关闭Hibernate会话。 而是为了理解它是如何在内部工作的,它在哪一层打开Hibernate会话,以及何时关闭Hibernate会话。 我创建了一个PoC。我有一个spring boot应用程序,它有两个实体,一个是,另一个是,和之间有一对多的关系。 我有一个两个API,一个是添加记录,另一个是获取所有记录。这些API存在于CustomerEnd

  • 我正在使用spring batch,在执行批处理作业时,我得到了一个InvalidIsolationLevelException。当我使用MapJobRepositoryFactoryBean时,该作业可以工作,但我需要在数据库中生成batch_*表。 应用程序已经设置了事务管理器。