我是Spring Reactive Project的新手。在我的Spring Boot Controller课程中
流量
来自给定的
流量的服务层
list of Flux<Image> like List<Flux<Image>> or List<List<Image>>
仅包含“封面”=“是”或“类型”=“卧室”的图像。如何做到这一点?编程代码将回答这个问题。
尝试将以下内容作为解决方案的一部分,但即使是此部分解决方案也不起作用:
List<Flux<Image>> imagesList= new ArrayList<Flux<Image>>();
Flux<House> houses = houseService.findAllHouses();
houses.map(house -> house.getId()).subscribe(id -> imageService.findByHouseId(id))
.map(imageFlux ->imagesList.add(imageFlux));
请注意,我正在寻找的解决方案不涉及调用block()(否定被动的好处),除非这是唯一的方法。
在非反应性情况下,这就是我想要的:
List<House> houses --> List of all houses
Map<String,List<Image>> mapOfImages --> where key is houseId
所以对于每个房子,我可以在视图模板中迭代房屋时轻松获得该房子的图像。
这些(房屋和地图图像)将传递给模型,如
model.addAttribute("houses",houses);
model.addAttribute("mapOfImages",mapOfImages);
因此,现在在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,也就是说,没有嵌入式集合,将图像绑定到房屋的唯一东西是image上的houseId属性。
您基本上希望将房屋
对象流转换为图像
对象流。
因此,使用flatMap()
转换通量
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>>
这里可以使用
CollectList()
,因为您最有可能想要将图像
转换为单个Mono
return images.map(imageList -> ServerResponse.ok()
.body(fromObject(imageList)));
此外,我建议阅读关于何时使用哪个运算符的项目反应器参考。
编辑:
所以,你想要一个单声道
我将描述艰难的方式,其中
图像
不包含房屋
id。我们需要某物,它链接属于特定房屋的图像列表。您可以为此定义一个类,也可以只使用reactor。util。作用元组2
。这样,我们就可以使用collectMap()
:
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);
我在NoSQL文档db Photo和Property中有两个独立的集合,其中Photo有propertyId参数,这意味着我可以找到属于给定属性(如房子)的所有照片。通常情况下,如果没有反应,我只会: 就两行。如何在反应式编程中做到以上几点 不使用block()?`承担一项义务。findByPropertyId返回列表,在被动情况下返回通量。
我正在使用project reactor,我有下一个问题: 我有一个返回的方法,它包含一个CustomerDto列表,每个客户机都有属性,其中一个属性是付款列表。但是这个付款清单是空的。 我有下一个例外: 我想知道是否有一种非阻塞或最佳的方法来做这件事
我现在正在使用Flux。我想创建一个通量 描述问题:我有一个工作案例,我有一个房屋清单和我所在的清单。我需要返回所有房屋的结果,我只会更改结果对象上的真/假标志。当然,第二个列表的元素可能更少。 有人能提出这样或其他的建议吗? }
我正在使用SpringReactor3组件和SpringIntegration进行实验,以从JMS队列创建反应流(Flux)。 我试图从JMS队列(使用SpringIntegration的ActiveMQ)创建一个反应流(SpringReactor3Flux),以供客户端异步获取JMS消息。我相信我已经正确连接了所有内容,但在服务器停止之前,客户端不会接收任何JMS消息。然后,所有消息都被“推送”
我有以下代码: 但它会导致编译错误,因为返回
问题内容: 我在Java中有一个对象(基本上是VO),但不知道其类型。 我需要获取在该对象中不为null的值。 如何才能做到这一点? 问题答案: 你可以用来获取该类的所有声明的字段。你可以用来获取价值。 简而言之: 要了解有关反射的更多信息,请查看有关该主题的Sun教程。 就是说,这些字段不一定全部代表VO的属性。你希望确定以或开头的公共方法,然后调用它以获取真实属性值。 也就是说,可能会有更优雅