我有一个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
。这可能吗?
谢谢!
答案 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()
。