Spring WebFlux:在 Spring 数据 MongoDB 反应性存储库中出现空值时发出异常?
Spring WebFlux: Emit exception upon null value in Spring Data MongoDB reactive repositories?
我正在尝试通过 spring-boot 2.0.0.M2
学习如何使用 MongoDB 反应性存储库,但我担心我没有按预期做事。
这是我的方法之一,它试图通过他们的电子邮件找到 User
。但是如果有none,方法应该抛出异常
@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()
我会阻止此方法成为反应式。我是反应式编程的新手,我很难找到关于它的好文档。有人可以给我指出正确的方向吗?
响应式编程需要一个端到端的响应式流程来获得来自响应式编程模型的实际好处。在流程中调用 .block()
会强制执行同步并被视为反模式。
对于您的代码,只需传播从 ReactiveCrudRepository
获得的 Mono
并应用 switchIfEmpty
运算符在 Mono
终止但未发出错误信号时发出错误信号价值。 null
Reactive Streams 规范(Project Reactor 所基于的规范)中不允许值。如果结果没有产生任何值,则 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);
}
另请参阅:
我正在尝试通过 spring-boot 2.0.0.M2
学习如何使用 MongoDB 反应性存储库,但我担心我没有按预期做事。
这是我的方法之一,它试图通过他们的电子邮件找到 User
。但是如果有none,方法应该抛出异常
@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()
我会阻止此方法成为反应式。我是反应式编程的新手,我很难找到关于它的好文档。有人可以给我指出正确的方向吗?
响应式编程需要一个端到端的响应式流程来获得来自响应式编程模型的实际好处。在流程中调用 .block()
会强制执行同步并被视为反模式。
对于您的代码,只需传播从 ReactiveCrudRepository
获得的 Mono
并应用 switchIfEmpty
运算符在 Mono
终止但未发出错误信号时发出错误信号价值。 null
Reactive Streams 规范(Project Reactor 所基于的规范)中不允许值。如果结果没有产生任何值,则 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);
}
另请参阅: