2017-07-28 1 views
0

Ich versuche zu lernen, wie MongoDB reaktive Repositories mit spring-boot 2.0.0.M2 zu verwenden, aber ich befürchte, dass ich nicht die Dinge wie beabsichtigt tun.Spring WebFlux: Emit Ausnahme bei Null-Wert in Spring Data MongoDB reaktiven Repositories?

Dies ist eine meiner Methoden, die versucht, eine User per E-Mail zu finden. Wenn jedoch keine vorhanden ist, sollte die Methode eine Ausnahme auslösen.

@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); 
} 

Das Repository erweitert ReactiveCrudRepository<User, String>, aber ich fürchte, dass .block() unter Verwendung ich diese Methode von bin zu verhindern reaktiv. Ich bin neu in der reaktiven Programmierung, und es fällt mir schwer, eine gute Dokumentation darüber zu finden. Kann mir bitte jemand in die richtige Richtung zeigen?

Antwort

4

Reaktive Programmierung erfordert einen Fluss, der Ende-zu-Ende reaktiv ist, um die tatsächlichen Vorteile eines reaktiven Programmiermodells zu erhalten. Der Aufruf von .block() im Flow erzwingt die Synchronisation und wird als Anti-Pattern betrachtet.

für Ihren Code, propagieren nur die Mono Sie von ReactiveCrudRepository erhalten und wenden Sie den switchIfEmpty Operator ein Fehlersignal zu emittieren, wenn die Mono beendet, ohne einen Wert abgibt. null Werte sind in der Reactive Streams-Spezifikation (der Spezifikation, auf der Project Reactor basiert) nicht zulässig. Wenn ein Ergebnis keinen Wert ergibt, gibt der Publisher keinen Wert aus. auch

@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); 
} 

Siehe:

+0

Dank, ich hatte total die switchIfEmpty (...) Methode verpasst. – Andreas

Verwandte Themen