[英]Return multiple Flux in a single object
我有多个列表作为来自不同数据库查询的 Flux 对象。 现在我想创建一个 object,我可以将所有 Flux 对象放入其中并将其返回给客户端。
例子:
public Mono<TestDto> getOverview() {
Flux<TestResult> a = repo.findA();
Flux<TestResult> b = repo.findB();
Flux<TestResult> c = repo.findC();
Flux<TestResult> d = repo.findD();
// How can I create a single DTO from the 4 Flux objects?
return dto;
}
public class TestDto {
private Flux<TestResult> a;
private Flux<TestResult> b;
private Flux<TestResult> c;
private Flux<TestResult> d;
}
我的 DTO 显然不起作用,因为它返回的是 Flux object 但不是实际数据。
这里有两种可能的方法,具体取决于最适合您的用例。
如果您想拥有一个通过Mono<TestDto>
响应式返回的TestDto
object ,则将您的 DTO 更改为包含列表而不是发布者,并为其提供一个全参数构造函数:
@AllArgsConstructor
public class TestDto {
private List<TestResult> a;
private List<TestResult> b;
private List<TestResult> c;
private List<TestResult> d;
}
...然后您可以使用Mono.zip()
和collectList()
来返回Mono<TestDto>
,如下所示:
return Mono.zip(arr -> new TestDto((List<TestResult>)arr[0],(List<TestResult>)arr[1],(List<TestResult>)arr[2],(List<TestResult>)arr[3]), a.collectList(), b.collectList(), c.collectList(), d.collectList());
以上可能是您想要的,并且是最“正常”的方法。 以下可能不是您所追求的,但为了完整起见,将其包括在内。
但是,如果您知道每个Flux
发布者将始终具有相同数量的元素,并且您希望响应式 stream a Flux<TestDto>
到客户端(其中每个单独的 TestDto 包含来自 a、b、c 和 d 的 TestResult)那么您可以修改您的 TestDto 以仅包含每个 TestResult 的单个值:
@AllArgsConstructor
public class TestDto {
private TestResult a;
private TestResult b;
private TestResult c;
private TestResult d;
}
然后,您可以通过压缩返回Flux<TestDto>
,如下所示:
return Flux.zip((Object[] arr) ->
new TestDto((TestResult)arr[0],(TestResult)arr[1],(TestResult)arr[2],(TestResult)arr[3]), a, b, c, d);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.