Java Reactor:来自 map() 的未处理异常,但由 fromCallable() 处理

lge*_*ean 1 java reactor

在以下两个示例中,第一个(带有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));
})
Run Code Online (Sandbox Code Playgroud)
Mono.fromCallable(() -> {
    return new ObjectMapper().readTree(jsonString);
})
.onErrorResume(IOException.class, error -> {
    return Mono.error(new InvalidContentException("error with the JSON. " + error));
})
Run Code Online (Sandbox Code Playgroud)

Yas*_*ham 5

Mono.fromCallable:- 使用 Callable 作为参数并创建一个MonoCallable扩展的新对象Mono。所以callable是一个 FunctionalInterface,它有一个方法,call()所以这个调用方法抛出异常。

例如:- 这不会引发异常

Callable<JsonNode> callableObj = () -> new ObjectMapper().readTree(jsonString);
Run Code Online (Sandbox Code Playgroud)

但是当我们调用该方法时,call()这将引发异常。

callableObj.call();

所以当我们调用它时,我们在这里创建了一个 MonoCallable,因此它不会抛出异常。因为它是类型Callable

Mono.fromCallable(() -> {
    return new ObjectMapper().readTree(jsonString);
})
Run Code Online (Sandbox Code Playgroud)

因此,当我们对 this 应用下游调用时,例如maporflatMap它将调用该call()方法。因此,如果发生异常,它将被包装到 MonoError 中,我们不必显式处理。

这就是为什么readTree没有在Mono.fromCallable.

为了进一步参考,您可以在此处检查 callable :- 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));
})
Run Code Online (Sandbox Code Playgroud)

它正在返回MonoMap,它Mono.map调用中扩展,因此我们必须处理它。