簡體   English   中英

Kotlin Spring Reactive Webflux - 處理 WebClient 錯誤

[英]Kotlin Spring Reactive Webflux - Handle WebClient Error

我在嘗試處理與調用 Spring webflux 的 Web 客戶端不同的錯誤時遇到了麻煩。

下面是我目前的代碼。

    return request
            .bodyToMono(InputMessage::class.java)
            .flatMap { inputMessage ->
                client
                        .get()
                        .uri { builder ->
                            builder.path("/message")
                                    .queryParam("message", inputMessage.message)
                                    .build()
                        }
                        .retrieve()
                        .onStatus({t: HttpStatus -> t.is5xxServerError}, {c: ClientResponse -> Mono.error(Throwable("Internal Server Error - try again later"))})
                        .bodyToMono(ListOfAddresses::class.java)
            }
            .flatMap { s -> ServerResponse.ok().syncBody(s) }

如果出錯,它仍會從客戶端調用返回完整的錯誤消息。

我嘗試了別的東西,像這樣

    return request
            .bodyToMono(InputMessage::class.java)
            .flatMap { inputMessage ->
                client
                        .get()
                        .uri { builder ->
                            builder.path("/message")
                                    .queryParam("message", inputMessage.message)
                                    .build()
                        }
                        .retrieve()
                        .onStatus({t: HttpStatus -> t.is5xxServerError}, {c: ClientResponse -> Mono.error(Throwable("Internal Server Error - try again later"))})
                        .bodyToMono(ListOfAddresses::class.java)
            }
            .flatMap { s -> ServerResponse.ok().syncBody(s) }
            .onErrorResume { e -> Mono.just("Error " + e.message)
                    .flatMap { s -> ServerResponse.ok().syncBody(s) } }

它實際上有效,但后來我想處理不同的 Http 狀態代碼錯誤(每個 Http 狀態代碼的不同消息)。

如何修改我的代碼以便它返回我構建的自定義消息?

根據WebFlux文檔,您可以使用exchangeToMono()awaitExchange { }以進行錯誤處理。

Mono<Object> entityMono = client.get()
    .uri("/persons/1")
    .accept(MediaType.APPLICATION_JSON)
    .exchangeToMono(response -> {
        if (response.statusCode().equals(HttpStatus.OK)) {
            return response.bodyToMono(Person.class);
        }
        else if (response.statusCode().is4xxClientError()) {
            // Suppress error status code
            return response.bodyToMono(ErrorContainer.class);
        }
        else {
            // Turn to error
            return response.createException().flatMap(Mono::error);
        }
    });

從上面的 WebFlux 鏈接復制的代碼。

看看2.3。 交換

val entity = client.get()
  .uri("/persons/1")
  .accept(MediaType.APPLICATION_JSON)
  .awaitExchange {
        if (response.statusCode() == HttpStatus.OK) {
             return response.awaitBody<Person>()
        }
        else if (response.statusCode().is4xxClientError) {
             return response.awaitBody<ErrorContainer>()
        }
        else {
             throw response.createExceptionAndAwait()
        }
  }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM