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

问题描述 投票:0回答:1

[在以下两个示例中,第一个(带有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));
})
java reactor
1个回答
0
投票

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);
})

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

这是readTreeMono.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,因此我们必须处理它。

© www.soinside.com 2019 - 2024. All rights reserved.