一尘不染

Spring 5 Reactive中的HTTP响应异常处理

spring-boot

我正在使用带有WebFlux反应式启动程序的Spring Boot 2和Spring 5开发一些反应式微服务。

我面临以下问题:我想处理从调用另一个REST服务收到的所有HTTP状态,并在收到一些错误的HTTP状态时引发异常。例如,当我调用一个端点并收到404
HTTP状态时,我想抛出一个异常,该异常将在某些ExceptionHandler类中进行处理,就像在Spring
4中使用的方式一样@ControllerAdvice

什么是正确的方法?希望能收到一些好的建议。


阅读 466

收藏
2020-05-30

共1个答案

一尘不染

这可以分为两个独立的部分。

如何将WebClient收到的HTTP 404响应转换为自定义异常

使用时WebClient,您可以从远程服务接收HTTP
404响应。默认情况下,所有响应4xx5xx客户端响应都将变为WebClientResponseException。因此,您可以在WebFlux应用程序中直接处理这些异常。

如果您只想将404响应转换为自定义异常,则可以执行以下操作:

WebClient webClient = //...
webClient.get().uri("/persons/1")
  .retrieve()
  .onStatus(httpStatus -> HttpStatus.NOT_FOUND.equals(httpStatus),
                        clientResponse -> Mono.error(new MyCustomException()))
  .bodyToMono(...);

显然,这是基于每个客户调用完成的。

您可以ExchangeFilterFunction通过WebClient实例在实例上设置一次来实现更可重用的方式:

WebClient.builder().filter(myExchangeFilterFunction)...

如何在WebFlux应用程序中处理自定义异常

使用带有注释的Spring WebFlux,您可以使用带有注释的方法处理异常@ExceptionHandler(请参阅Spring
Framework参考文档
)。

注意:可以使用a WebExceptionHandler,但是它的级别很低,因为那里没有高级支持:您需要使用缓冲区手动编写响应,而无需任何序列化支持。

2020-05-30