Saltar al contenido

Spring Reactor: Mono.zip falla en Mono vacío

Solución:

El operador de zip no se comporta así. De hecho, sería contrario a la intuición: ¿su código espera una tupla de 3 elementos y solo obtiene dos?!?

En este caso, usted tiene el control y solo usted puede decidir cuál es un buen valor predeterminado si no se proporciona ninguno (recuerde, null los valores están prohibidos por la especificación de flujos reactivos).

Mono<String> m1 = Mono.just("A");
Mono<String> m2 = Mono.just("B");
Mono<String> m3 = Mono.empty().defaultIfEmpty("");

Mono<String> combined = Mono.when(m1, m2, m3).map(t -> {
    StringBuffer sb = new StringBuffer();
    sb.append(t.getT1());
    sb.append(t.getT2());
    sb.append(t.getT3());
    return sb.toString();
});

Editar

Pareces confundido por la naturaleza de un Publisher tipo, ver:

si uno de los Monos es un Mono vacío, el zip falla sin un error

y

Entonces, si intentara comprimir Mono’s y por alguna razón uno está vacío, el zip fallaría y parece que no puedo ingresar ningún código para protegerme contra eso

Un vacío Mono no es un caso de falla: es solo que no se emite ningún valor y se completa con éxito. Puede verificarlo cambiando el código de muestra:

    combined.subscribe(
            s -> System.out.println("element: " + s), // doesn't execute
            s -> System.out.println("error: " + s), // doesn't execute
            () -> { System.out.println("complete!"); // prints
    });

Entonces, dependiendo de sus requisitos, puede:

  • aplicar una defaultIfEmpty operador en esos 3 Mono instancias, si hay valores predeterminados convenientes en los que puede confiar
  • aplicar una defaultIfEmpty operador en el combinado Mono, con un valor predeterminado o incluso transformarlo en un mensaje de error con combined.switchIfEmpty(Mono.error(...))
¡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 *