如何在服务层从数据库中取不出任何内容时返回Mono :: error

问题描述 投票:1回答:1

我正在使用此代码块从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);
    }

}
java spring-boot reactive-programming couchbase project-reactor
1个回答
5
投票

当找不到给定的referenceRepository.getReferenceTable(key)Mono时,ReferenceTable返回一个空的key

从存储库的角度来看,这不是错误条件。要将空Mono视为错误条件,您可以在流中使用.switchIfEmpty(Mono.error(...))

以下是适用.switchIfEmpty的示例:

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));

另外,我对您的示例进行了两处其他更改:

  1. 由于你的.flatMap实现是一个同步的1对1映射,你可以使用.map代替,就像我上面所做的那样。
  2. 由于你的.onErrorResume实现返回了与观察到的相同的异常,你可以像我上面所做的那样使用.doOnError,允许原始异常继续传播。
© www.soinside.com 2019 - 2024. All rights reserved.