Spring WebFlux:在Spring Data MongoDB反应库中发出null值的异常吗?

时间:2017-07-28 05:51:28

标签: java spring reactive-programming spring-data-mongodb

我正在尝试使用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()我会阻止此方法被动反应。我是反应式编程的新手,我很难找到好的文档。有人可以指出我正确的方向吗?

1 个答案:

答案 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);
}

另见: