【问题标题】:Retrieve a Java.Util.List from a Flux in Spring Web Reactive Framework从 Spring Web Reactive Framework 中的 Flux 中检索 Java.Util.List
【发布时间】:2019-09-14 04:12:27
【问题描述】:

我有一个端点,它应该使用 ExcelUtility 类获取一个 Excel 文档,该类需要一个 Java.Util.List。

我正在使用 Mongodb 获取数据,但 Mongodb 返回一个 Flux myList。

如何“给”ExcelUtility 类 List myList 以生成可以在 ResponseEntity 中返回的 Workbook 类?

到目前为止,我有这个代码:

final Workbook myWorkBook = ExcelUtils                               
.pojo2xlsx(this.myMongoRepository.findAll()
.toStream().collect(Collectors.toList()), 
 MyType.class);

myMongoRepository.findAll 方法返回一个 Flux。这是一个标准的 ReactiveMongoRepository 接口。

我想问题归结为我需要“阻止”流以获取列表,以便我的自定义 Excel 服务可以获取常规列表。我可以在测试代码中做到这一点,但是在 Web Reactive Framework 中运行时,似乎不允许阻塞。

【问题讨论】:

    标签: java reactive-programming spring-webflux


    【解决方案1】:

    假设你是从你想要的响应式上下文中调用它

    Mono<Workbook> wb = s.collectList().map(l -> ExcelUtils.pojo2xlsx(l));
    

    在这种情况下,您不想自己开始工作,也不想在反应式调度程序管理的线程中造成阻塞。您只需将这个新的 Mono 返回到框架,让它决定何时以及如何安排工作。

    但是,如果您从需要返回工作簿的普通方法中调用它,那么您别无选择,只能阻塞,但这种同步方法的期望是您将开始工作并阻塞直到它完成.

    【讨论】:

    • 谢谢,好像差不多了。如何将 Mono wb 转换为 'Mono>' 这应该是一个 web 服务调用。
    • @ArmandoPerea map 可用于从同步 Mono 转换。 Mono&lt;ResponseEntity&lt;Workbook&gt;&gt; wb = s.collectList().map(l -&gt; new ResponseEntity&lt;Workbook&gt;(ExcelUtils.pojo2xlsx(l), HttpStatus.OK));
    猜你喜欢
    • 2017-05-14
    • 2023-03-19
    • 2018-09-15
    • 1970-01-01
    • 2018-11-19
    • 1970-01-01
    • 1970-01-01
    • 2017-09-21
    • 2018-07-25
    相关资源
    最近更新 更多