2

在下面的两个示例中,第一个(带有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));
})
4

2 回答 2

6

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

例如:- 这不会引发异常

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

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

callableObj.call();

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

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

因此,当我们对此应用下游调用时,mapflatMap会调用该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));
})

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

于 2019-10-22T09:38:53.447 回答
2

原因是 Mono.fromCallable 采用了一个 Callable 接口,该接口能够抛出一个异常。但是,map 采用不会抛出任何异常的 Function 接口。但是里面的代码

.map(jsonString1 -> {
return new ObjectMapper().readTree(jsonString1);})

可能会抛出一个检查异常。所以静态语法检查会报错。如果 map 抛出一个运行时异常,它不会报告任何错误。所以一种方法是

try {
    //code that might throw checked exception

} catch(IOException e) 
{
  throw new RuntimeException(e)
}
于 2021-01-30T09:39:12.890 回答