【问题标题】:Throw an error when the error comes in the payload of a 200 status code当错误出现在 200 状态码的有效负载中时抛出错误
【发布时间】:2019-12-25 16:16:38
【问题描述】:

我有一个 API 可以通过多种方式返回错误(我知道这不是一个好主意,但它是一个遗留 API)。仅当前一个调用成功时,我才必须连接三个 API 调用,除了某些在有效负载中返回错误(状态为 200)的情况外,我一直在使用这种方法。为此,我想使用 Spring Web Client 并执行以下操作:

Mono
        .when(placeOrderCall)
        .doOnSuccess(response -> {
          if (!isSuccesful(response)) {
              throw new Exception("");
          }
        })
        .then(changeSubscription)
        .doOnSuccess(response -> {
          if (!isSuccesful(response)) {
            throw new Exception("");
          }
        })
        .then(httpCall)
        .doOnSuccess(response -> {
          if (!isSuccesful(response)) {
            throw new Exception("");
          }
        })
        .doOnError(error -> System.out.println("Error"))
        .block();

但我不能在doOnSuccess 中抛出异常...我想中断流程并将其发送到doOnError。这可能吗?

谢谢!!!

【问题讨论】:

    标签: reactive-programming spring-webflux spring-webclient


    【解决方案1】:

    既然你没有提到为什么你不能在doOnSuccess 中抛出异常,所以我猜这是因为checked Exception。所以,为此,简单的解决方案是像下面一样抛出RuntimeException -

    throw new RuntimeException("");

    【讨论】:

      【解决方案2】:

      请阅读有关handle() 方法的反应器文档部分。

      你的代码可以改写如下:

         Mono
          .when(placeOrderCall)
          .handle((res, sink) -> {
            if (!isSuccesful(response)) {
              sink.error(new Exception(""));
            } else {
              sink.next(res);
            }
          })
          .then(changeSubscription)
          .handle((res, sink) -> {
            if (!isSuccesful(response)) {
              sink.error(new Exception(""));
            } else {
              sink.next(res);
            }
          })
          .then(httpCall)
          .handle((res, sink) -> {
            if (!isSuccesful(response)) {
              sink.error(new Exception(""));
            } else {
              sink.next(res);
            }
          })
          .doOnError(error -> System.out.println("Error"))
          .block();
      

      如果任何句柄方法执行sink.error(),则不会调用后续的then()函数,只会调用最后一个.doOnError()

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-05-14
        • 2023-03-17
        • 1970-01-01
        • 2016-03-02
        • 2021-02-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多