Comment renvoyer Flux comme réponse lors de l'utilisation de Spring Reactor et Spring Boot?


Jbaur

J'essaye d'utiliser Spring Reactor avec mon application Spring Boot.

J'utilise Project Reactor 3.0.7.RELEASE et Spring Boot 1.5.3.RELEASE.

J'ai une méthode dans ma classe Service qui renvoie Flux.

Je souhaite renvoyer la valeur au contrôleur dans la couche Web. Mais, je ne vois pas les valeurs renvoyées dans la réponse json.

Lorsque j'appelle http: // localhost: 8080 à partir du navigateur, j'obtiens une réponse comme {"prefetch": - 1}

Je ne suis pas sûr de devoir faire une conversion de Flux en String avant de renvoyer la réponse.

J'ai mon code partagé, https://github.com/bsridhar123/spring-reactor-demo/blob/master/src/main/java/com/demo/reactor/ReactiveApp.java

Pouvez-vous s'il vous plaît m'aider sur la bonne approche pour cela.

Simon Baslé

Le support réactif complet à l'aide de Reactor n'est implémenté que dans Spring 5 (actuellement en phase RC) et Spring Boot 2 (actuellement en phase Milestone).

Vous pouvez utiliser Reactor indépendamment de Spring, mais cela ne rend pas le framework réactif et asynchrone , vous perdez donc certains avantages. Vous ne pouvez pas simplement retourner un Fluxcar le framework ne comprend pas encore ce type.

Cependant, je pense que cela peut toujours être utile dans la couche service, si vous devez orchestrer de nombreux appels de service.

Ce que vous pouvez faire dans ce cas est d'utiliser Fluxet Monodans toute votre couche de service et de les convertir en Spring 4 DeferredResult. Quelque chose comme:

DeferredResult<ResponseEntity<String>> result = new DeferredResult<>();
service.getSomeStringMono()
       .map(n -> ResponseEntity.ok(n))
       .defaultIfEmpty(ResponseEntity.notFound().build()
       .subscribe(re -> result.setResult(re),
                  error -> result.setErrorResult(error));
return result;

Articles connexes