当前位置: 首页 > 知识库问答 >
问题:

Kotlin Spring Reactive Webflux-处理WebClient错误

王经赋
2023-03-14

我在尝试处理调用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) } }

我如何修改我的代码,使它返回我生成的自定义消息?

共有1个答案

丌官浩旷
2023-03-14

根据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链接复制的代码。

 类似资料:
  • 我想在以下条件下抛出自定义异常: > 如果我得到了json格式的正确错误响应,我想反序列化它,并在onStatus()中抛出名为CommonException的异常 如果作为响应的一部分接收HTML内容或反序列化未成功执行,则我希望抛出GenericeException,这是我在onErrorMap()中创建的 在抛出GenericException时,我希望将从下游响应获得的相同HttpStat

  • 我们使用和作为Spring 5.1.9的一部分,使用方法发出请求。此方法的文档强调了以下内容: ...使用exchange()时,应用程序有责任使用任何响应内容,而不管场景如何(成功、错误、意外数据等)。不这样做会导致内存泄漏。 如果我理解实现,那么如果请求被成功调度,将始终给我们一个响应,而不管响应代码是什么(例如4xx、5xx)。在这个场景中,我们只需要调用来使用响应。我关心的是错误场景(例如

  • 我是一个穿Spring靴的新手,我需要你的帮助。 我使用WebClient发出GET请求,我收到一个JSON正文,如下所示: 所以我有一个DTO类,其中映射响应。类似于这样: 我使用以下方法: 最后,我用这种方法进行了测试: 在响应具有KO状态之前一切正常。如果出现问题(即坏请求),我会收到相同的正文JSON结构,如下所示: 有没有办法在我的DTO类上也用KO状态映射JSON主体?我想返回retr

  • 我有一个spring webclient对外部服务进行http调用,并得到反应式断路器工厂(resilience4J impl)的支持。当客户端建立连接并响应失败(任何内部服务器或4XX错误)时,WebClient和断路器的行为符合预期。但是,如果客户端无法建立连接,无论是连接被拒绝还是未知主机,它都会开始崩溃。 我似乎无法在webClient中捕获错误消息并触发断路器。 断路器永远不会打开并抛出

  • 我已经在如下所示的过滤器中实现了错误处理: 如果响应带有一个主体,那么< code > response . bodytomono(string . class ),这样做应该没问题。平面地图(...)被执行。然而当身体是空的时候,什么都不会发生,但是我想要的是也处理错误。我的理解是,我会这样做: 这不起作用,因为预期返回的类型是Mono而不是Mono。 我如何在有响应体和无响应体的情况下实现对错

  • 我是webflux的新手,无法找到正确的材料来继续实现。 null