我正在尝试使用spring-boot 2.0.0.M2
学习如何使用MongoDB反应性存储库,但我担心我没有按预期执行操作。
这是我的一种方法,它试图通过电子邮件找到User
。但如果没有,该方法应抛出异常。
@Override
public Mono<User> findByEmail(String email) {
User user = repository.findByEmail(email).block();
if(user == null) {
throw new NotFoundException("No user account was found with email: " + email);
}
return Mono.just(user);
}
存储库扩展ReactiveCrudRepository<User, String>
,但我担心使用.block()
我会阻止此方法被动反应。我是反应式编程的新手,我很难找到好的文档。有人可以指出我正确的方向吗?
答案 0 :(得分:14)
反应式编程需要端到端响应的流程,以获得来自反应式编程模型的实际好处。在流程中调用.block()
会强制执行同步,并被视为反模式。
对于您的代码,只需传播从Mono
获取的ReactiveCrudRepository
并应用switchIfEmpty
运算符,如果Mono
终止而不发出值,则发出错误信号。 Reactive Streams规范(Project Reactor所基于的规范)中不允许null
个值。如果结果没有产生任何值,则Publisher
不会发出值。
@Override
public Mono<User> findByEmail(String email) {
Mono<User> fallback = Mono.error(new NotFoundException("No user account was found with email: " + email));
return repository.findByEmail(email).switchIfEmpty(fallback);
}
另见: