当错误出现在状态码为200的有效载荷中时,抛出错误

时间:2019-12-25 16:16:38

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

我有一个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。这可能吗?

谢谢!

2 个答案:

答案 0 :(得分:0)

从那时起,您还没有提到为什么无法在item_trialAreas_ids item_trialAreas_names 1 it1 2 it2 3 it3 ... ... 中引发异常,所以我猜测这是由于doOnSuccess引起的。因此,为此,简单的解决方案是像下面一样抛出checked Exception-

RuntimeException

答案 1 :(得分:0)

请阅读有关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();

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