有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何让服务层在不从数据库获取任何内容时返回Mono::错误

我使用这个代码块从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) 个答案

  1. # 1 楼答案

    当找不到具有给定keyReferenceTablereferenceRepository.getReferenceTable(key)返回空Mono

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

    以下是应用^{}的示例:

    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,允许原始异常继续传播