[在以下两个示例中,第一个(带有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));
})
Mono.fromCallable
:-使用Callable作为参数并创建一个扩展了MonoCallable
的新Mono
对象。因此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 for callable,您可以在此处检查直到致电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
,因此我们必须处理它。