来自 Spring WebFlux Mono 中断的异常 Mono.zip
Exception from a Spring WebFlux Mono interrupts Mono.zip
假设我使用 spring webclient 进行了两次调用。两者都定义如下,在 .onStatus :
中抛出异常
public Mono<Model> getCall(String path) {
webClient.get()
.uri(path)
.retrieve()
.onStatus(HttpStatus::isError, errorHandler())}
这是异常函数 errorHandler() :
private Function<ClientResponse, Mono<? extends Throwable>> errorHandler() {
return clientResponse -> clientResponse.bodyToMono(ErrorResponse.class).
flatMap(errorBody -> Mono.error(new CustomException(clientResponse.statusCode().value(), "exception", errorBody)));
在我的 Mono.zip 上,我定义如下:
Mono.zip(getCall(call1),
getCall(call2))
.block;
问题是,如果其中一个调用抛出异常,我至少无法再获得其中一个结果。尝试使用:
.onErrorContinue(CustomException.class, (error, output) -> log.error("CustomException !" + error + output))
那么我如何处理 Mono.zip 的异常,就像我们处理 try catch 一样,但又不停止执行并获取成功调用的结果?
还有谢谢
如果您的输出为空状态,您可以执行以下操作:
.onErrorResume(CustomException.class, e -> Model.empty())
如果你没有空状态,你应该将输出包装成 Optional
:
.map(Optional::of)
.onErrorResume(CustomException.class, e -> Optional.empty())
在任何情况下,这些运算符都应链接到 getCall
方法。例如:
public Mono<Model> getCall(String path) {
return webClient.get()
.uri(path)
.retrieve()
.onStatus(HttpStatus::isError, errorHandler())
.retrieve()
.bodyToMono(Model.class)
.onErrorResume(CustomException.class, e -> Model.empty());
}
假设我使用 spring webclient 进行了两次调用。两者都定义如下,在 .onStatus :
中抛出异常public Mono<Model> getCall(String path) {
webClient.get()
.uri(path)
.retrieve()
.onStatus(HttpStatus::isError, errorHandler())}
这是异常函数 errorHandler() :
private Function<ClientResponse, Mono<? extends Throwable>> errorHandler() {
return clientResponse -> clientResponse.bodyToMono(ErrorResponse.class).
flatMap(errorBody -> Mono.error(new CustomException(clientResponse.statusCode().value(), "exception", errorBody)));
在我的 Mono.zip 上,我定义如下:
Mono.zip(getCall(call1),
getCall(call2))
.block;
问题是,如果其中一个调用抛出异常,我至少无法再获得其中一个结果。尝试使用:
.onErrorContinue(CustomException.class, (error, output) -> log.error("CustomException !" + error + output))
那么我如何处理 Mono.zip 的异常,就像我们处理 try catch 一样,但又不停止执行并获取成功调用的结果? 还有谢谢
如果您的输出为空状态,您可以执行以下操作:
.onErrorResume(CustomException.class, e -> Model.empty())
如果你没有空状态,你应该将输出包装成 Optional
:
.map(Optional::of)
.onErrorResume(CustomException.class, e -> Optional.empty())
在任何情况下,这些运算符都应链接到 getCall
方法。例如:
public Mono<Model> getCall(String path) {
return webClient.get()
.uri(path)
.retrieve()
.onStatus(HttpStatus::isError, errorHandler())
.retrieve()
.bodyToMono(Model.class)
.onErrorResume(CustomException.class, e -> Model.empty());
}