3 回答

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

TA貢獻1874條經驗 獲得超12個贊
你問的時候不是很清楚
“如何讓 zip 方法拋出異常而不返回 null?”
在 WebFlux 中,您通常不會拋出異常,而是傳播異常然后處理它們。為什么?因為我們正在處理數據流,如果拋出異常,流就會結束,客戶端會斷開連接,事件鏈也會停止。
我們仍然希望維護數據流并在數據流經時處理不良數據。
您可以使用該doOnError方法處理錯誤。
.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 )
如果您想做更具體的事情,您必須用您希望如何處理錯誤來更新您的問題。

TA貢獻1836條經驗 獲得超4個贊
每當收到狀態碼為 4xx 或 5xx 的響應時,WebClient 中的retrieve() 方法就會拋出 WebClientResponseException。
與retrieve()方法不同,exchange()方法在4xx或5xx響應的情況下不會拋出異常。您需要自己檢查狀態代碼并按照您想要的方式處理它們。
? ?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))
添加回答
舉報