Cpt*_*RD0 1 java reactive-programming couchbase spring-boot 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);
});
Run Code Online (Sandbox Code Playgroud)
正在使用的服务层如下所示:
@Service("referenceService")
public class CouchbaseReferenceService implements ReferenceService {
@Autowired
private ReferenceRepository referenceRepository;
@Override
public Mono<ReferenceTable> getReferenceTable(String key) {
return referenceRepository.getReferenceTable(key);
}
}
Run Code Online (Sandbox Code Playgroud)
referenceRepository.getReferenceTable(key)找不到与给定的Mono时返回空值。ReferenceTablekey
从存储库的角度来看,这不是错误情况。要将空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));
Run Code Online (Sandbox Code Playgroud)
另外,我对您的示例进行了另外两项更改:
.flatMap实现是同步的1对1映射,因此可以.map像上面所做的那样使用。.onErrorResume实现返回的异常与观察到的相同,因此您可以.doOnError像上面所做的那样使用,从而允许原始异常继续传播。| 归档时间: |
|
| 查看次数: |
56 次 |
| 最近记录: |