【问题标题】:Spring WebFlux: Emit exception upon null value in Spring Data MongoDB reactive repositories?Spring WebFlux:在 Spring Data MongoDB 反应式存储库中发出空值异常?
【发布时间】:2017-07-28 05:51:27
【问题描述】:

我正在尝试学习如何使用 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&lt;User, String&gt;,但我担心使用.block() 会阻止此方法反应。我是响应式编程的新手,我很难找到关于它的好的文档。有人可以指出我正确的方向吗?

【问题讨论】:

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


    【解决方案1】:

    响应式编程需要一个端到端的响应式流程来获得来自响应式编程模型的实际好处。在流中调用 .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);
    }
    

    另见:

    【讨论】:

    • 谢谢,我完全错过了 switchIfEmpty(...) 方法。
    猜你喜欢
    • 2018-02-08
    • 2018-06-06
    • 2019-02-28
    • 2014-05-31
    • 2013-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多