【问题标题】:Handling Global Scenarios in Spring WebFlux在 Spring WebFlux 中处理全局场景
【发布时间】:2020-10-31 13:16:12
【问题描述】:

我有一个 Rest Web 客户端来执行 API 调用,并且我处理下面给出的异常。

我想以全局方式处理 404、401 和 400 错误,而不是在单个客户端级别处理。我们怎样才能做到这一点。

public Mono<ProductResponse> getProductInformation(String productId) {
        return webClient.get()
                .uri("/v1/products/"+productId)
                .accept(MediaType.APPLICATION_JSON)
                .retrieve()
                .onStatus( httpStatus -> HttpStatus.NOT_FOUND.equals(httpStatus), clientResponse -> {
                    Mono<NotFound> notFound = clientResponse.bodyToMono(NotFound.class);
                    return notFound.flatMap( msg -> {
                        log.info(" Error Message {}" , msg.getErrorMsg());
                        return Mono.error(new NotFoundException(msg.getErrorMsg()));
                    });
                }).onStatus( httpStatus -> HttpStatus.UNAUTHORIZED.equals(httpStatus), clientResponse -> {
                    Mono<NotFound> notFound = clientResponse.bodyToMono(NotFound.class);
                   return Mono.error(new NotAuthorisedException("Unauthorised"));
                }).bodyToMono(ProductResponse.class);
    }

【问题讨论】:

  • 嘿@jagannathan 你问这个问题已经有一段时间了。你那边有什么更新吗?你试过我提供的答案了吗?
  • @AbhinabaChakraborty 忘记更新正确答案。现已接受。

标签: spring-webflux spring-webclient


【解决方案1】:

两种方法:

  1. Web 客户端的异常都包含在 WebClientResponseException 类中。您可以像这样使用 Spring 的 ExceptionHandler 注释来处理。
  @ExceptionHandler(WebClientResponseException.class)
  public ResponseEntity handleWebClientException(WebClientResponseException ex){
    return ResponseEntity.badRequest().body(ex.getResponseBodyAsString());
  }

注意 - 在这里您可以使用 getStatusCode()getRawStatusCode()getStatusText() 等方法,根据响应状态编写复杂的条件逻辑getHeaders()getResponseBodyAsString()。您还可以获取使用 getRequest 方法发送的请求的参考。

  1. 在构造 webclient bean 时使用 ExchangeFilterFunction
  @Bean
  public WebClient buildWebClient() {

    Function<ClientResponse, Mono<ClientResponse>> webclientResponseProcessor =
        clientResponse -> {
          HttpStatus responseStatus = clientResponse.statusCode();
          if (responseStatus.is4xxClientError()) {
            System.out.println("4xx error");
            return Mono.error(new MyCustomClientException());
          } else if (responseStatus.is5xxServerError()) {
            System.out.println("5xx error");
            return Mono.error(new MyCustomClientException());
          }
          return Mono.just(clientResponse);
        };

    return WebClient.builder()
        .filter(ExchangeFilterFunction.ofResponseProcessor(webclientResponseProcessor)).build();
  }

然后您可以使用 @ExceptionHandler 处理 MyCustomClientException 或保持原样。

【讨论】:

    猜你喜欢
    • 2020-03-23
    • 2019-11-08
    • 1970-01-01
    • 1970-01-01
    • 2018-08-18
    • 2020-06-03
    • 2021-11-12
    • 1970-01-01
    • 2021-08-13
    相关资源
    最近更新 更多