У меня проблема с onErrorContinue (), что объект, переданный Biconsumer, имеет значение null.
Я использую Spring boot 2.1.13.RELEASE и реактивный mon go с ядром реактора версии 3.2 .15.RELEASE.
Проблема возникает, когда вызов базы данных для получения записи с идентификатором не возвращает никакой записи, а с помощью оператора switchIfEmtpy () я генерирую исключение, используя Mono.error () и нижестоящий i попробуйте обработать это исключение с помощью onErrorContinue ().
Код ниже объясняет проблему:
public static void main(String[] args) {
Flux.range(1, 10)
.flatMap(integer -> mapInteger(integer))
.doOnNext(System.out::println)
.onErrorContinue((throwable, o) -> System.out.println("error with " + o)) // o is null
.subscribe();
}
public static Mono<Integer> mapInteger(Integer num) { // This is here to simulate the db call
return Mono.just(num)
.flatMap(t -> {
if (t == 5)
return Mono.empty();
else
return Mono.just(num * 2);
})
.switchIfEmpty(Mono.error(new RuntimeException("Error happened while mapping integer!")));
}
Это напечатает следующие значения:
2
4
6
8
error with null
12
14
16
18
20
PS. У меня нет проблемы, когда в потоке возникает другая ошибка.
Обновление: mapInteger () должен был имитировать приведенный ниже вызов репозитория reactivemon go:
public Mono<MetaData> getFromDbByKey(String key) {
return repository
.findByKeyAndDeletedIsFalse(key)
.switchIfEmpty(Mono.error(() -> new RuntimeException()));
}
и вызов getFromDbByKey () возвращает эти метаданные, которые мне нужно сопоставить с потоком в основном потоке.
с onErrorContinue мы ловим Throwable и в зависимости от его типа выполняем различную обработку для каждого типа ошибки .