java - 如何让服务层在从数据库中获取任何内容时返回 Mono::error
问题描述
我正在使用此代码块从 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);
}
}
解决方案
referenceRepository.getReferenceTable(key)
当没有找到给定的Mono
a 时返回一个空。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));
另外,我对您的示例进行了另外两项更改:
- 由于您的
.flatMap
实现是同步的一对一映射,因此您可以使用.map
,就像我在上面所做的那样。 - 由于您的
.onErrorResume
实现返回了与观察到的相同的异常,因此您可以.doOnError
像我在上面所做的那样使用,允许原始异常继续传播。
推荐阅读
- javascript - 如果值为 0,则谷歌图表隐藏堆栈
- rxjs - 在 Angular 6 rxjs 流中进行异步调用的最佳方法
- atom-editor - Atom Pakage 安装错误:binding.mkdir(pathModule._makeLong(path)
- php - 给出错误 HTTP 状态代码“600”无效。提交ajax后
- reactjs - React 视差效果库正在破坏我的应用程序
- javascript - NextJS 和 React:我如何从服务器返回页面?
- php - 将 PHP chr()/strval() 函数转换为 C++
- javascript - 无法从 typescript/javascript 中的字符串数组替换具有括号的子字符串
- c# - C# 自定义事件为 NULL
- angular6 - 如何在Angular 6的组件类中使数组动态化