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

Webclient错误处理-Spring Webflux

袁文景
2023-03-14

我想在以下条件下抛出自定义异常:

>

  • 如果我得到了json格式的正确错误响应,我想反序列化它,并在onStatus()中抛出名为CommonException的异常

    如果作为响应的一部分接收HTML内容或反序列化未成功执行,则我希望抛出GenericeException,这是我在onErrorMap()中创建的

    在抛出GenericException时,我希望将从下游响应获得的相同HttpStatus代码传递给上游。

     IdVerificationResponse idVerificationResponse = client.get()
     .uri(idVerificationUrl)
     .headers(headers -> headers.addAll(httpEntity.getHeaders()))
     .retrieve()
     .onStatus(HttpStatus::isError, response ->
         //Throw this one only if deserialization of error response to IdVerificationErrorResponse class happens successfully
    
         response.bodyToMono(IdVerificationErrorResponse.class)
             .flatMap(error -> Mono.error(CommonException.builder().message(error.getCustomMessage()).build()))
     )
     .bodyToMono(IdVerificationResponse.class)
     .onErrorMap(error -> {
         //Come over here only if there is an error in deserialization in onStatus()
    
         //How to get the HttpStatus we are getting as part of error response from the downstream
         HttpStatus httpStatus = HttpStatus.BAD_REQUEST;
         ApiErrorDetails errorDetailsObj = ApiErrorDetails.builder().errorCode(httpStatus.name()).errorDescription("Error related to HTML")
               .errorDetails("Error related to HTML").build();
         ErrorDetails errorDetails = ErrorDetails.builder().errors(errorDetailsObj).build();
         return GenericException.builder().errorDetails(errorDetails).httpStatus(httpStatus).build();
     }).block();
    

    目前onErrorMap()每次都被调用,并覆盖我在onState()内抛出的异常

  • 共有1个答案

    潘高洁
    2023-03-14

    找到了解决办法

    IdVerificationResponse idVerificationResponse = client.get()
        .uri(processCheckUrl)
        .headers(headers -> headers.addAll(httpEntity.getHeaders()))
        .retrieve()
        .onStatus(HttpStatus::isError, response -> {
                HttpStatus errorCode = response.statusCode();
                return response.bodyToMono(IdVerificationErrorResponse.class)
                    .onErrorMap(error -> new Exception("Throw your generic exception over here if there is any error in deserialization"))
                    .flatMap(error -> Mono.error(new Exception("Throw your custom exception over here after successful deserialization")));
            })
        .bodyToMono(IdVerificationResponse.class).block();
    
     类似资料:
    • 我在尝试处理调用Spring WebFlux的web客户机的不同错误时遇到了麻烦。 我如何修改我的代码,使它返回我生成的自定义消息?

    • 我们使用和作为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中捕获错误消息并触发断路器。 断路器永远不会打开并抛出

    • 通过对错误类型实现 Display 和 From,我们能够利用上绝大部分标准库错误处理工具。然而,我们遗漏了一个功能:轻松 Box 我们错误类型的能力。 标准库会自动通过 Form 将任意实现了 Error trait 的类型转换成 trait 对象 Box<Error> 的类型(原文:The std library automatically converts any type that imp

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