第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

如何使用Springboot對(duì)WebFlux進(jìn)行異常處理?

如何使用Springboot對(duì)WebFlux進(jìn)行異常處理?

慕尼黑5688855 2023-08-09 17:16:56
我有 3 個(gè)微服務(wù)應(yīng)用程序。我正在嘗試使用反應(yīng)包中的 webclient 進(jìn)行 2 次異步調(diào)用,然后在收到響應(yīng)時(shí)將它們組合起來(lái)。示例代碼:(引用自 - https://docs.spring.io/spring/docs/5.1.9.RELEASE/spring-framework-reference/web-reactive.html#webflux-client-synchronous)Mono<Person> personMono = client.get().uri("/person/{id}", personId)        .retrieve().bodyToMono(Person.class);Mono<List<Hobby>> hobbiesMono = client.get().uri("/person/{id}/hobbies", personId)        .retrieve().bodyToFlux(Hobby.class).collectList();Map<String, Object> data = Mono.zip(personMono, hobbiesMono, (person, hobbies) -> {            Map<String, String> map = new LinkedHashMap<>();            map.put("person", personName);            map.put("hobbies", hobbies);            return map;        })        .block();我的問(wèn)題是如何向 get 調(diào)用添加異常處理?如何檢查我是否收到 404 或 204 或其他信息?我努力了:將 .onStatus() 添加到 GET 調(diào)用    .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))))    .onStatus(HttpStatus::is5xxServerError, clientResponse ->          Mono.error(new Data5xxException(              String.format("For Data %s, Error Occurred: %s", key, clientResponse))))添加異常處理程序 - 但我確實(shí)沒(méi)有控制器,所以這似乎不起作用。@ExceptionHandler(WebClientException.class)    public Exception handlerWebClientException(WebClientException webClientException) {        return new Data4xxException("Testing", webClientException);    }添加了一個(gè)包含 ControllerAdvice 和 ExceptionHandler 的類@ControllerAdvicepublic class WebFluxExceptionHandler {    @ExceptionHandler(WebClientException.class)    public Exception handlerWebClientException(WebClientException webClientException) {        return new Data4xxException("Testing", webClientException);    }}但我沒(méi)有看到它們打印在 spring-boot 日志中。Mono.zip.block() 方法只是返回 null 并且實(shí)際上不會(huì)拋出任何異常。如何讓 zip 方法拋出異常而不返回 null ?
查看完整描述

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 或任何其他您想要處理異常的類。


查看完整回答
反對(duì) 回復(fù) 2023-08-09
?
HUWWW

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)匀幌MS護(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)題。


查看完整回答
反對(duì) 回復(fù) 2023-08-09
?
HUH函數(shù)

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))

查看完整回答
反對(duì) 回復(fù) 2023-08-09
  • 3 回答
  • 0 關(guān)注
  • 344 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)