java - 使用 MongoReactiveRepository 和项目反应器进行数据替换
问题描述
如果 mongo 中的数据与已存储的数据不同,我会尝试替换它,并且我编写了这段代码
public <T> Mono<Void> replaceObjectsIfNotAlreadyStored(List<T> products, ReactiveCrudRepository<T, String> objRepository) {
return objRepository.findAll()
.collectList()
.filter(productsList -> !areAlreadyInDb(productsList, products))
.flatMap(products1 -> objRepository.deleteAll()).
doOnSuccess(products1 -> objRepository.saveAll(products).collectList());
}
但是当我试图测试它时
@Test
public void replaceObjectsIfNotAlreadyStoredNeg() {
repository.saveAll(products)
.collectList()
.block();
checksumService.replaceObjectsIfNotAlreadyStored(otherList, repository).block();
List<Product> current = repository.findAll()
.collectList()
.block();
assertEquals(current, otherList);
repository.deleteAll()
.block();
}
当前列表是空的,而不是像 otherList 一样
解决方案
这是因为您试图在 doOn* 方法中触发一些异步处理,这与 flatMap 不同,它不订阅内部的通量/单声道。您必须以某种方式订阅,推荐的方法是使用 flatMap (如果您想在前一个运算符中有结果时做某事,我不相信这里是这种情况)或 switchIfEmpty (如果源运算符什么都不发出,但仍然成功)
推荐阅读
- python - numpy 中是否有一种方法可以从 3d 数组中计算每个 2d 数组的平均值?
- ssl - 默认虚拟主机的 Qualys SslLabs 报告单个 ip 上的第二个虚拟主机证书的证书不匹配
- c++ - 尝试重载输出运算符时,我无法遍历对象向量
- python - 我不知道我的语音识别程序出了什么问题
- c# - Visual Studio 2019 在配置为 64 位时构建 32 位可执行文件
- javascript - 如何在ajax响应后重绘数据表
- wordpress - 为 Wordpress (5.3.2) 获取 HTTP ERROR 500
- java - 如何使用 PrintWriter 或 JSP 将解析后的数据返回给用户?
- javascript - 向数组中传递的组件添加 refs
- c# - 如何将对象存储在列表或字典中(JS方式)?