3 回答

TA貢獻(xiàn)1795條經(jīng)驗(yàn) 獲得超7個(gè)贊
執(zhí)行此操作的方法是按以下方式使用 onErrorMap:
Mono<Person> personMono = client.get()
.uri("/person/{id}", personId)
.retrieve()
.bodyToMono(Person.class)
.onErrorMap((Throwable error) -> error);
onErrorMap將使 Mono 在 Zip 阻塞時(shí)真正拋出錯(cuò)誤,終止 zip 并讓 spring 或任何其他您想要處理異常的類。

TA貢獻(xiàn)1874條經(jīng)驗(yàn) 獲得超12個(gè)贊
你問(wèn)的時(shí)候不是很清楚
“如何讓 zip 方法拋出異常而不返回 null?”
在 WebFlux 中,您通常不會(huì)拋出異常,而是傳播異常然后處理它們。為什么?因?yàn)槲覀冋谔幚頂?shù)據(jù)流,如果拋出異常,流就會(huì)結(jié)束,客戶端會(huì)斷開(kāi)連接,事件鏈也會(huì)停止。
我們?nèi)匀幌MS護(hù)數(shù)據(jù)流并在數(shù)據(jù)流經(jīng)時(shí)處理不良數(shù)據(jù)。
您可以使用該doOnError方法處理錯(cuò)誤。
.onStatus(HttpStatus::is4xxClientError, clientResponse ->
Mono.error(new Data4xxException(String.format(
"Could not GET data with id: %s from another app, due to error:
%s", key, clientResponse))))
Mono.zip( .. ).doOnError( //Handle your error, log or whatever )
如果您想做更具體的事情,您必須用您希望如何處理錯(cuò)誤來(lái)更新您的問(wèn)題。

TA貢獻(xiàn)1836條經(jīng)驗(yàn) 獲得超4個(gè)贊
每當(dāng)收到狀態(tài)碼為 4xx 或 5xx 的響應(yīng)時(shí),WebClient 中的retrieve() 方法就會(huì)拋出 WebClientResponseException。
與retrieve()方法不同,exchange()方法在4xx或5xx響應(yīng)的情況下不會(huì)拋出異常。您需要自己檢查狀態(tài)代碼并按照您想要的方式處理它們。
? ?Mono<Object> result = webClient.get().uri(URL).exchange().log().flatMap(entity -> {
? ? ? ? HttpStatus statusCode = entity.statusCode();
? ? ? ? if (statusCode.is4xxClientError() || statusCode.is5xxServerError())
? ? ? ? {
? ? ? ? ? ? return Mono.error(new Exception(statusCode.toString()));
? ? ? ? }
? ? ? ? return Mono.just(entity);
? ? }).flatMap(clientResponse -> clientResponse.bodyToMono(JSONObject.class))
添加回答
舉報(bào)