Java Reactor: необработанное исключение из map (), но обрабатывается из fromCallable () - PullRequest
0 голосов
/ 11 октября 2019

В следующих двух примерах первый (с map()) говорит мне, что есть необработанное исключение из readTree(), но не во втором примере. Почему так ? Спасибо!

Mono.just(jsonString)
.map(jsonString1 -> {
    return new ObjectMapper().readTree(jsonString1);
})
.onErrorResume(IOException.class, error -> {
    return Mono.error(new InvalidContentException("error with the JSON. " + error));
})
Mono.fromCallable(() -> {
    return new ObjectMapper().readTree(jsonString);
})
.onErrorResume(IOException.class, error -> {
    return Mono.error(new InvalidContentException("error with the JSON. " + error));
})

1 Ответ

3 голосов
/ 22 октября 2019

Mono.fromCallable: - использует Callable в качестве параметра и создает новый объект MonoCallable, который расширяет Mono .So callable - это FunctionalInterface, который имеет метод call(), поэтому этот метод вызова вызывает исключение.

Например: - Это не сгенерирует исключение

Callable<JsonNode> callableObj = () -> new ObjectMapper().readTree(jsonString);

, но когда мы вызываем метод call(), сгенерируется исключение.

callableObj.call();

Поэтому, когда мы вызываем это, мы создаем MonoCallable здесь, следовательно, он не вызывает исключение. Так как он имеет тип Callable.

Mono.fromCallable(() -> {
    return new ObjectMapper().readTree(jsonString);
})

Так что, когда мы применяемнисходящий вызов этого типа, например map или flatMap, вызовет метод call(). Поэтому, если возникнет исключение, оно будет заключено в MonoError, и нам не нужно явно обрабатывать его.

Это причина, по которой readTree не выдавал ошибку в Mono.fromCallable.

. Для дальнейшего ознакомления вы можете проверить здесь вызываемое: - javadoc для вызываемого , где выможете проверить, что до тех пор, пока вы не вызовете call(), оно не вызовет исключение.

Принимая во внимание, что в этом случае: -

Mono.just(jsonString)
.map(jsonString1 -> {
    return new ObjectMapper().readTree(jsonString1);
})
.onErrorResume(IOException.class, error -> {
    return Mono.error(new InvalidContentException("error with the JSON. " + error));
})

Возвращается MonoMap, который расширяет Mono в.map вызов, следовательно, мы должны обработать его.

...