2017-07-28 27 views
0

我正試圖學習如何使用MongoDB反應性存儲庫使用spring-boot 2.0.0.M2,但我擔心我沒有按照預期做事。Spring WebFlux:在Spring Data MongoDB反應性存儲庫中發出null值時發生異常?

這是我的方法之一,它試圖通過他們的電子郵件找到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()我阻止這種方法從被動。我是新來的反應式編程,我很難找到好的文檔。有人可以請指點我正確的方向嗎?

回答

4

無功編程需要一個端到端的反應流程來獲得來自反應式編程模型的實際收益。在流程中調用.block()會強制同步,並被視爲反模式。

爲您的代碼,只是傳播MonoReactiveCrudRepository獲取和應用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); 
} 

參見:

+0

謝謝,我已經完全錯過了switchIfEmpty(...)方法。 – Andreas

相關問題