当服务层没有从数据库中获取任何内容时,如何使服务层返回Mono :: error

时间:2019-04-22 20:23:45

标签: java spring-boot reactive-programming couchbase project-reactor

我正在使用此代码块从Couchbase检索一些数据,但是当它无法获取任何内容时,它不会调用onErrorResume块。当找不到与密钥匹配的文档时,有什么方法可以使此代码调用onErrorResume

return referenceService.getReferenceTable(referenceKey)
    .flatMap(referenceTable -> {
        logger.info("reference table: {}", referenceTable.toString());
        Market market = getMarket(aggregate.getDate(), aggregate.getMarket(), referenceTable);
        aggregate.setMarket(market);
        return Mono.just(aggregate);
    })
    .onErrorResume(e -> {
        logger.info("Error getting reference table");
        return Mono.error(e);
    });

正在使用的服务层如下:

@Service("referenceService")
public class CouchbaseReferenceService implements ReferenceService {

    @Autowired
    private ReferenceRepository referenceRepository;

    @Override
    public Mono<ReferenceTable> getReferenceTable(String key) {
        return referenceRepository.getReferenceTable(key);
    }

}

1 个答案:

答案 0 :(得分:5)

referenceRepository.getReferenceTable(key)未找到带有给定Mono的{​​{1}}时返回空的ReferenceTable

从存储库的角度来看,这不是错误情况。要将空的key视为错误条件,可以在流中使用Mono

以下是您应用了.switchIfEmpty的示例:

.switchIfEmpty(Mono.error(...))

此外,我对您的示例进行了另外两项更改:

  1. 由于您的return referenceService.getReferenceTable(referenceKey) .switchIfEmpty(Mono.error(() -> new RuntimeException("No reference table found with key " + referenceKey))) .map(referenceTable -> { logger.info("reference table: {}", referenceTable.toString()); Market market = getMarket(aggregate.getDate(), aggregate.getMarket(), referenceTable); aggregate.setMarket(market); return aggregate; }) .doOnError(e -> logger.info("Error getting reference table", e)); 实现是同步的一对一映射,因此可以像上面所做的那样使用.flatMap
  2. 由于您的.map实现返回了与观察到的异常相同的内容,因此您可以像上面所做的那样使用.onErrorResume,从而允许原始异常继续传播。