【问题标题】:Exception from a Spring WebFlux Mono interrupts Mono.zipSpring WebFlux Mono 的异常中断 Mono.zip
【发布时间】:2021-11-16 16:03:48
【问题描述】:

假设我有两个使用 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 一样,但又不停止执行并获得成功调用的结果? 谢谢你

【问题讨论】:

    标签: java spring-webflux reactive spring-webclient


    【解决方案1】:

    如果您的输出为空状态,您可以执行以下操作:

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

    【讨论】:

    • 这实际上是一个有效的解决方案,但我没有提到约束(我的错),我无法编辑 Monos 的代码,我只能访问调用和 mono.zip跨度>
    • 这并没有太大区别,您仍然可以使用Mono.zip(getCall(call1).onErrorResume..., getCall2()....) 或创建一个私有方法作为getCall 的包装器,这样您就不需要复制
    • 在通话中使用 onErrorResume 解决了我的问题,谢谢!
    • 还有一件事,你知道我们如何在另一个单声道中返回一个不同于 Model 而不是 Mono.empty() 的对象
    • 不确定我是否明白这个问题。如果您想在出错时返回不同类型的对象,则需要更改方法的返回类型,使其成为 Model 的超类型和不同对象的类型。
    猜你喜欢
    • 2021-11-12
    • 2021-11-09
    • 2018-12-12
    • 2019-09-19
    • 2019-03-11
    • 2021-11-18
    • 2020-04-30
    • 2018-09-21
    • 1970-01-01
    相关资源
    最近更新 更多