Есть ли способ объединить несколько моно сигналов ошибки? - PullRequest
1 голос
/ 28 мая 2020

Есть ли способ объединить несколько сигналов об ошибках? Например:

    return Mono.zipDelayError(
        monoOne(), //throws ValidationException with list of validation details 1
        monoTwo(),
        monoThree() //throws ValidationException with list of validation details 2
    )
    .then();
}

в результате я хочу вернуть ValidationException с объединенным списком деталей проверки

1 Ответ

2 голосов
/ 28 мая 2020

Вы можете использовать служебный метод Exceptions.unwrapMultiple() для получения List<Throwable>, что позволит вам затем сократить этот список до одного ValidationException (или выполнить любую другую проверку / обработку, которая вам нравится.)

Тогда это просто случай обертывания вышеуказанного в onErrorMap():

Mono.zipDelayError(
        Mono.error(new ValidationException("Reason 1")),
        Mono.just("ok"),
        Mono.error(new ValidationException("Reason 2"))
)
.onErrorMap(e ->
        Exceptions.unwrapMultiple(e).stream()
                .reduce((e1, e2) -> new ValidationException(String.join(", ", e1.getMessage(), e2.getMessage()))).get()
);

..., что дает:

Exception in thread "main" reactor.core.Exceptions$ReactiveException: ValidationException: Reason 1, Reason 2

Обратите внимание, что Exceptions.unwrapMultiple() все равно будет работать в случае, когда исключение не является множественным - в этом случае вы просто получите одноэлементный список.

...