Реактор: обнаружение пустого сигнала, чтобы иметь возможность действовать на пустой моно
Есть оператор или какой-то хороший подход для достижения поведения doOnEmpty() с Project Reactor Mono?
Я хочу иметь побочные эффекты (логирование) для результата операции.
Вот что у меня сейчас:
myMono
.map(value -> new Wrapped(value))
.defaultIfEmpty(new Wrapped(null))
.doOnEach( ... )
.flatMap(wrapped ->
wrapped.value == null ?
Mono.empty() : Mono.just(wrapped.value))
Таким образом, я обертываю фактическое значение или в случае пустого создания пустой оболочки. Затем оболочка потребляется для побочных эффектов.
Вместо этого было бы неплохо использовать что-то вроде doOnEmpty(Consumer> signalConsumer). Чтобы усложнить ситуацию, мне нужен доступ к Сигналу, чтобы получить доступ к Контексту (содержит данные, необходимые для регистрации).
Есть эти ответы, но я не думаю, что они применяются или предоставляют доступ к контексту.
Итак, теперь, когда я думаю об этом, возможно, правильный вопрос:
"Есть ли способ определить на DoOnEach(Consumer Signal), если наблюдаемое разрешено пустым?"
0 ответов
Некоторые примеры реализации "Пустой уловки" без побочного эффекта.
- doOnSuccess - вызывается с результатом, допускающим значение NULL
Mono.empty()
.doOnSuccess(result -> {
if (result == null) {
// This is an empty result
Logger.info(this.getClass(), "result = {}", result);
}
})
.subscribe();
- switchIfEmpty + doOnError - пропустить конвейер, используя выброс и перехват известного исключения
Mono.empty()
.switchIfEmpty(Mono.error(new Exception()))
.doOnNext(o -> Logger.info(Object.class, "doOnNext"))
.doOnError(Exception.class, error -> Logger.info(Exception.class, "doOnError"))
.subscribe();