当它从数据库中获取任何内容时如何将服务层获取到 return a Mono::error
How to get service layer to return a Mono::error when it fetches nothing from database
我正在使用此代码块从 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);
}
}
当找不到具有给定 key
的 ReferenceTable
时,referenceRepository.getReferenceTable(key)
返回空 Mono
。
从存储库的角度来看,这不是错误情况。要将空 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
,允许原始异常继续传播。
我正在使用此代码块从 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);
}
}
key
的 ReferenceTable
时,referenceRepository.getReferenceTable(key)
返回空 Mono
。
从存储库的角度来看,这不是错误情况。要将空 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
,允许原始异常继续传播。