首页 > 解决方案 > 使用 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 一样

标签: javaspringspring-webfluxproject-reactor

解决方案


这是因为您试图在 doOn* 方法中触发一些异步处理,这与 flatMap 不同,它不订阅内部的通量/单声道。您必须以某种方式订阅,推荐的方法是使用 flatMap (如果您想在前一个运算符中有结果时做某事,我不相信这里是这种情况)或 switchIfEmpty (如果源运算符什么都不发出,但仍然成功)


推荐阅读