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