Saltar al contenido

WebFlux funcional: ¿Cómo detectar un Flux vacío y devolver 404?

Esta es la solución más correcta que encomtrarás dar, pero estúdiala pausadamente y analiza si es compatible a tu trabajo.

Solución:

A partir de una Mono:

return customerMono
           .flatMap(c -> ok().body(BodyInserters.fromObject(c)))
           .switchIfEmpty(notFound().build());

A partir de una Flux:

return customerFlux
           .collectList()
           .flatMap(l -> 
               if(l.isEmpty()) 
                 return notFound().build();

               
               else 
                 return ok().body(BodyInserters.fromObject(l)));
               
           );

Tenga en cuenta que collectList almacena datos en la memoria, por lo que esta podría no ser la mejor opción para listas grandes. Puede haber una mejor manera de resolver esto.

Usar Flux.hasElements() : Mono función:

return customerFlux.hasElements()
                   .flatMap 
                     if (it) ok().body(customerFlux)
                     else noContent().build()
                   

Además de la solución de Brian, si no desea hacer una verificación vacía de la lista todo el tiempo, puede crear una función de extensión:

fun  Flux.collectListOrEmpty(): Mono> = this.collectList().flatMap 
        val result = if (it.isEmpty()) 
            Mono.empty()
         else 
            Mono.just(it)
        
        result
    

Y llámalo como lo haces con el Mono:

return customerFlux().collectListOrEmpty()
                     .switchIfEmpty(notFound().build())
                     .flatMap(c -> ok().body(BodyInserters.fromObject(c)))

Eres capaz de proteger nuestra tarea exponiendo un comentario o puntuándolo te damos las gracias.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *