2017-07-28 1 views
0

J'essaie d'apprendre à utiliser les dépôts réactifs MongoDB en utilisant spring-boot 2.0.0.M2, mais je crains de ne pas faire les choses comme prévu.Spring WebFlux: Exception d'exception sur une valeur nulle dans les dépôts réactifs Spring Data MongoDB?

Ceci est l'une de mes méthodes, qui essaie de trouver un User par leur email. Mais s'il n'y en a pas, la méthode devrait lancer une exception.

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

Le dépôt se prolonge ReactiveCrudRepository<User, String>, mais je crains qu'en utilisant .block() j'empêcher cette méthode d'être réactif. Je suis nouveau à la programmation réactive, et j'ai du mal à trouver une bonne documentation à ce sujet. Quelqu'un peut-il me diriger dans la bonne direction?

Répondre

4

La programmation réactive nécessite un flux réactif de bout en bout pour obtenir les avantages réels d'un modèle de programmation réactif. Appeler .block() dans le flux applique la synchronisation et est considéré comme un anti-pattern.

Pour votre code, propager juste le Mono que vous obtenez de ReactiveCrudRepository et d'appliquer l'opérateur switchIfEmpty pour émettre un signal d'erreur si le Mono se termine sans émettre une valeur. Les valeurs null ne sont pas autorisées dans la spécification Reactive Streams (la spécification sur laquelle repose le projet Reactor). Si un résultat ne donne aucune valeur, le Publisher n'émet pas de valeur.

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

Voir aussi:

+0

Merci, j'avais totalement raté la méthode switchIfEmpty (...). – Andreas