首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Kotlin Spring Reactive Webflux -处理WebClient错误

Kotlin Spring Reactive Webflux -处理WebClient错误
EN

Stack Overflow用户
提问于 2019-07-26 11:07:39
回答 2查看 1.7K关注 0票数 2

从调用Spring webflux的web客户端开始,我在尝试处理不同的错误时遇到了麻烦。

下面是我当前的代码。

代码语言:javascript
复制
    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) }

如果出错,它仍然会从客户端的调用中返回完整的错误消息。

我试过别的,像这样

代码语言:javascript
复制
    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状态码有不同的消息)。

我如何修改我的代码,使其返回我构建的自定义消息?

EN

回答 2

Stack Overflow用户

发布于 2020-12-14 01:53:20

根据WebFlux文档,您可以使用exchangeToMono()awaitExchange { }来进行错误处理。

代码语言:javascript
复制
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链接复制的代码。

票数 1
EN

Stack Overflow用户

发布于 2021-06-07 08:08:55

看一看2.3. Exchange

代码语言:javascript
复制
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()
        }
  }
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57212633

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档