WebClient 异常处理程序

WebClient exception handler

我想为调用外部 API 的 WebClient 创建异常处理程序。我不想使用 onStatus() 方法,因为我有具有不同方法的抽象 Web 客户端,我必须在其中处理异常,所以我必须在我的每个抽象方法中复制粘贴每个 onStatus()。我想做一些类似于 rest 模板方法的事情:我们可以实现 ResponseErrorHandler 并将我们的实现添加到 resttemplate 中,例如设置异常处理程序(我们的实现)。我想要一个 class 来处理所有异常。 提前感谢您的建议!

你可以那样做

@ControllerAdvice
public class ErrorControllerAdvice {
  @ExceptionHandler({RuntimeException.class})
  public ResponseEntity<?> handleRuntimeException(RuntimeException e) {
    log.error(e.getMessage(), e);
    return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(e.getMessage());
  }

  @ExceptionHandler({Exception.class})
  public ResponseEntity<?> handleRuntimeException(Exception e) {
    log.error(e.getMessage(), e);
    return ResponseEntity.status(HttpStatus.OK)
        .body(e.getMessage());
  }
}
@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();

}

我们可以使用ResponseProcessor来编写逻辑,处理不同的http状态。此解决方案已经过测试并且有效。

GithubSample