Выдать ошибку, когда ошибка появляется в полезной нагрузке кода состояния 200

У меня есть один API, который возвращает ошибки несколькими способами (я знаю, что это не очень хорошая идея, но это устаревший API). Мне нужно объединить три вызова API, только если предыдущий вызов успешен, у меня работает этот подход, за исключением некоторых случаев, когда возвращаются ошибки в полезной нагрузке (со статусом 200). Для этого я хочу использовать веб-клиент Spring и делаю следующее:

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. Это возможно?

Спасибо!!!


person Asier    schedule 25.12.2019    source источник


Ответы (2)


Поскольку вы не упомянули, почему вы не можете генерировать исключение в doOnSuccess, я предполагаю, что это из-за checked Exception. Итак, для этого простое решение - бросить RuntimeException, как показано ниже:

throw new RuntimeException("");

person Vikas Sachdeva    schedule 26.12.2019

Пожалуйста, прочитайте часть документации по реактору о методе 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().

person Stepan Tsybulski    schedule 30.12.2019