es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo devolver Flux en ServerResponse en WebFlux

Tengo una capa Jdbc que devuelve Flux. Mientras devuelve los datos, el método fromPublisher acepta otras clases Serializable, pero no acepta 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

enter image description here

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El problema parece ser con el método fromPublisher que acepta clases Serializable pero no acepta Flux<string>. Una alternativa para devolver un Flux de Strings como respuesta podría ser:

    public Mono<serverresponse> getNames(ServerRequest request) {
        Flux<string> strings = Flux.just("a", "b", "c");
        return ServerResponse
                .ok()
                .contentType(MediaType.APPLICATION_STREAM_JSON)
                .body(strings, String.class);
    }
    

    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étodo body con String.class como el tipo de los elementos en el Flux.

    Ten en cuenta que estamos usando MediaType.APPLICATION_STREAM_JSON en lugar de APPLICATION_JSON porque estamos devolviendo un flujo de objetos, no un solo objeto.

Comments are closed.