Spring boot 在Spring反应式编程中,如何从两个通量(对象)中获取通量或列表?
我对Spring项目是新手。在我的Spring Boot Controller类中,我有Spring boot 在Spring反应式编程中,如何从两个通量(对象)中获取通量或列表?,spring-boot,spring-webflux,project-reactor,reactor,Spring Boot,Spring Webflux,Project Reactor,Reactor,我对Spring项目是新手。在我的Spring Boot Controller类中,我有 Flux(数据库中所有房屋的列表)和Flux 来自服务层,其中给定的Flux是给定房屋的图像,就像房屋列表一样,每个房屋都有自己的图像集合。这意味着我必须迭代Flux以获取房屋id,然后在图像上调用findByHouseId以获取Flux,每个图像都有houseId属性。每个图像对象都有一个属性“cover”,其字符串值为“yes”或“no”,另一个属性“type”具有各种字符串值,如“卧房”。我想收一张支
Flux(数据库中所有房屋的列表)和Flux
来自服务层,其中给定的Flux
是给定房屋的图像,就像房屋列表一样,每个房屋都有自己的图像集合。这意味着我必须迭代Flux
以获取房屋id,然后在图像上调用findByHouseId以获取Flux
,每个图像都有houseId属性。每个图像对象都有一个属性“cover”,其字符串值为“yes”或“no”,另一个属性“type”具有各种字符串值,如“卧房”。我想收一张支票
list of Flux<Image> like List<Flux<Image>> or List<List<Image>>
因此,现在在thyemleaf视图模板中,我可以:
<div data-th-each="house : ${houses}">
<h3 data-th-text="${house.title}"></h3>
<div data-th-each="image : ${mapOfImages.get(house.houseId)}">
<h5 data-th-text="${image.fileName}"></h5>
<h5 data-th-text="${image.type}"></h5>
</div>
</div>
所使用的数据库是Mongodb,它有两个独立的集合:house和image,也就是说,没有嵌入式集合,将图像绑定到房屋的唯一东西是图像上的houseId属性。您基本上希望将
房屋
对象流转换为图像
对象流
因此,使用flatMap()
将Flux
(或Flux
)转换为Flux
另外,我建议你读一读
编辑:
因此,您需要一个
monplease共享实际的类和一个演示您所尝试的代码片段。我认为本文应该对您有所帮助,也请参阅本文并感谢Murat。正在到达那里,但仍然没有到达那里。为了澄清,我在问题末尾添加了更多文本。好的,请参阅最后一次编辑。我认为collectMultiMap()
可以做你想做的事。希望这能解决你的问题。看起来不错。我将用它来实现。大多数图像具有houseId属性,但少数图像(如街景或城市视图类型图像)的houseId属性为空,但当该房屋显示在视图中时,仍将为该房屋收集此类图像以显示关联的街景或城市图像。谢谢你会在我完成后很快更新。当然,希望对你有所帮助
List<House> houses --> List of all houses
Map<String,List<Image>> mapOfImages --> where key is houseId
model.addAttribute("houses",houses);
model.addAttribute("mapOfImages",mapOfImages);
<div data-th-each="house : ${houses}">
<h3 data-th-text="${house.title}"></h3>
<div data-th-each="image : ${mapOfImages.get(house.houseId)}">
<h5 data-th-text="${image.fileName}"></h5>
<h5 data-th-text="${image.type}"></h5>
</div>
</div>
Mono<List<Image>> images = houseService.findAllHouses() // returns Flux<House>
.flatMap(house -> imageService.findByHouseId(id) // returns Flux<Image>
.filter(image -> "yes".equals(image.getCover()) && ... ))
.collectList(); //returns Mono<List<Image>>
return images.map(imageList -> ServerResponse.ok()
.body(fromObject(imageList)));
Mono<Map<String, Collection<Image>>> images = houseService.findAllHouses()
.flatMap(house -> imageService.findByHouseId(id)
.filter(...)
.map(image -> Tuples.of(id, image)))
.collectMultiMap(tuple -> tuple.getT1(),
tuple -> tuple.getT2());
...
.collectMultiMap(image -> image.getHouseId(), image -> image);