Cómo devolver Flux en ServerResponse en WebFlux
Tengo una capa Jdbc que devuelve Flux
Enfoque 1
public Mono<ServerResponse> getNames(final ServerRequest request) {
Flux<String> strings = Flux.just("a", "b", "c");
return ServerResponse.ok().contentType(APPLICATION_JSON)
.body(fromPublisher(strings, String.class));
}
El enfoque anterior devuelve “abc” combinado como una única cadena.
Intenté esto:
return ServerResponse.ok()
.contentType(APPLICATION_JSON)
.body(BodyInserters.fromValue(response), List.class);
También intenté esto:
Mono<List<String>> mono = response.collectList();
return ServerResponse.ok()
.contentType(APPLICATION_JSON)
.body(fromPublisher(mono, String.class));
Pero esto también da un error en tiempo de ejecución:
'body' should be an object, for reactive types use a variant specifying
a publisher/producer and its related element type
davy.ai
El problema parece ser con el método
fromPublisher
que acepta clasesSerializable
pero no aceptaFlux<string>
. Una alternativa para devolver un Flux de Strings como respuesta podría ser:Aquí, establecemos el tipo de contenido como
APPLICATION_STREAM_JSON
, lo que indica que la respuesta será un flujo de objetos JSON. Luego, devolvemos directamente el Flux de Strings utilizando el métodobody
conString.class
como el tipo de los elementos en el Flux.Ten en cuenta que estamos usando
MediaType.APPLICATION_STREAM_JSON
en lugar deAPPLICATION_JSON
porque estamos devolviendo un flujo de objetos, no un solo objeto.