java - 反应式存储库返回空 Mono 时如何运行逻辑?
问题描述
我有如下界面,可以在 MongoDB 中通过 phoneNumber 查找实体:
public interface UserRepository extends ReactiveMongoRepository<User, String> {
Mono<User> findByPhoneNumber(String phoneNumber);
}
当 Mono 为空时,此代码正在运行并引发异常,但我不喜欢它。
userRepository.findByPhoneNumber(PHONE_NUMBER)
.switchIfEmpty(Mono.error(new IllegalArgumentException("user phone number not exist: " + PHONE_NUMBER)))
.subscribe(result -> {
// DO LOGIC HERE
});
我想做这样的事情。我不想抛出异常,因为在 MongoDB 中找不到用户实体是正常的。当 Mono 为空时,我想采用不同的逻辑。
userRepository.findByPhoneNumber(PHONE_NUMBER)
.switchIfEmpty(() -> {
// DO OTHER LOGIC HERE when Mono is empty
})
.subscribe(result -> {
// DO LOGIC HERE
});
解决方案
我认为您可以使用 Spring WebFlux 文档示例获得更好的代码
所以而不是:
userRepository.findByPhoneNumber(PHONE_NUMBER)
.switchIfEmpty(() -> {
// DO OTHER LOGIC HERE when Mono is empty
})
.subscribe(result -> {
// DO LOGIC HERE
});
你会有类似的东西
public Mono<User> findByPhoneNumber(String phoneNumber) {
return repository.findByPhoneNumber(phoneNumber)
.switchIfEmpty(Throw YOUR_EX());
}
如果您不想在 Exception 中抛出异常switchIfEmpty
,可以尝试 returnin a Mono.Empty
:
public Mono<User> findByPhoneNumber(String phoneNumber) {
return repository.findByPhoneNumber(phoneNumber)
.switchIfEmpty(Mono.defer(() -> {
log.error("No Users found with phoneNumber [{}]", phoneNumber);
return Mono.empty();
}));
}
您也可以在此处获得一些详细信息。
推荐阅读
- wordpress - 在 WooCommerce 中为每个购物车项目设置运输方式
- typescript - 如何在我的 http 服务器中使用 Express Session?
- flutter - 广告未在颤动中显示时占用的空白空间
- python - Python子进程导出环境变量(使用其他环境变量)
- android - 颤振“字符串”不是“列表”类型的子类型
' - javascript - 如何等待功能完成?
- node.js - Firestore 从 where 查询中获取子集合
- javascript - 如何使用一个import语句而不是多个使用react和javascript?
- python - 如果上下文不存在,Django 在视图中重定向
- css - 角闪烁的图标