问题描述
在这个示例中,我无法弄清楚为什么第一个doOnError
代码没有得到执行,我有使用WebClient
调用REST服务并以InputStream
的形式返回响应的方法:
public InputStream loadAsstream() throws IOException {
PipedOutputStream osPipe = new PipedOutputStream();
PipedInputStream isPipe = new PipedInputStream(osPipe);
Mono<ClientResponse> mono = WebClient.builder()
.baseUrl("http://localhost:8089/")
.build()
.get()
.uri("/loadData")
.accept(MediaType.ALL)
.exchange()
.doOnError(e -> LOG.error("first doOnError: ",e));
Flux<DataBuffer> flux = DataBufferUtils.write(mono.flatMapMany(response -> response.body(BodyExtractors.toDataBuffers())),osPipe);
flux.doOnError(e -> LOG.error("second doOnError: ",e))
.doFinally(s -> LOG.debug("finally"))
.subscribe(DataBufferUtils.releaseConsumer());
return isPipe;
}
InputStream稍后将用于使用ObjectMapper反序列化POJO:
try (InputStream inputStream = loadService.loadAsstream()) {
pojo = objectMapper.readValue(inputStream,SimplePojo.class);
} catch (IOException ex) {
throw new RuntimeException(ex);
}
例如,如果服务不可用并且REST调用因错误而失败,则第一个doOnError
和第二个doOnError
都将执行,但是如果我在反序列化期间遇到异常(在objectMapper.readValue
内部),那么只有第二个doOnError
被执行,请您帮我了解原因吗?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)