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
вызов, следовательно, мы должны обработать его.