2017-07-28 3 views
0

spring-boot 2.0.0.M2を使用してMongoDBリアクティブリポジトリを使用する方法を学習しようとしていますが、私が意図したとおりのことをしていないことを恐れています。Spring WebFlux:SpringデータMongoDBリアクティブリポジトリのnull値に対して例外を発行しますか?

これは自分のメールでUserを見つけようとする私の方法の1つです。しかし、何もない場合、メソッドは例外をスローする必要があります。

@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()を呼び出すと、同期が強制され、アンチパターンとみなされます。あなたのコードの場合

、ちょうど伝播 Monoあなたが ReactiveCrudRepositoryから取得し Monoが値を放出せずに終了した場合、エラー信号を発するように switchIfEmpty演算子を適用します。 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); 
} 

も参照してください:

+0

おかげで、私は完全にswitchIfEmpty(...)メソッドを逃していました。 – Andreas

関連する問題