首页 > 解决方案 > 控制器是否应该将集合包装到 Flux 中?

问题描述

每当我需要在 spring webflux 控制器中返回一个对象集合时,我应该返回一个普通集合还是一个通量?

现在我使用普通的集合:

@GetMapping("/)
fun getData(): List<DomainObject> {
  return inmemorycache.getAll()
}

只是想知道如果我包裹在助焊剂中它是否会有所不同。代码内部没有异步边界,一切都在内存中。您能否指出一些澄清这一点的文档?

标签: spring-webflux

解决方案


每当我需要在 spring webflux 控制器中返回一个对象集合时,我应该返回一个普通集合还是一个通量?

你在这里陈述的选项有点奇怪。如果您不使用反应式堆栈,那么您唯一明智的选择是标准集合。你不会把它包装成一个反应类型,这将是零意义的,只会让人感到困惑。

但是,如果您使用的是 Webflux,这意味着一个响应式堆栈,那么您的选择可能会返回 aMono<List<DomainObject>>或 a Flux<DomainObject>。(您不能返回标准集合,否则您将不得不阻止。)

简短的回答是,在大多数情况下,您几乎肯定需要 aMono<List<DomainObject>>而不是 a Flux<DomainObject>

AFlux是一个包含 0 到 n 个值的流,它可能会结束也可能不会结束,并且每个元素之间可能有任意时间。它通常以“换行符分隔的 JSON”格式或类似格式通过保持打开的连接并在数据可用时通过管道传输给客户端。典型的应用程序可能包括订阅消息队列、通过 websocket 将即时消息传递到浏览器(例如)。

另一方面,如果您有一个想要一次性返回给客户的标准值列表 - 那就Mono<List<DomainObject>更有意义了。它是一次性交付的值(因此Mono),通常作为标准请求/响应模型的一部分交付,其中响应将是包含所述列表的标准 JSON 对象(当然还有您想要添加的任何其他属性。 ) 这是“正常”方法,如果您在上游使用通量作为该处理的一部分,则调用collectList()它将其转换为Mono.


推荐阅读