我们如何将 @ExceptionHandler 与 spring web flux 一起使用?

新手上路,请多包涵

在 spring web 中,我们可以使用注解 @ExceptionHandler 来处理控制器的服务器和客户端错误。

我尝试将此注释与 web-flux 控制器一起使用,它仍然对我有用,但经过一些调查后我发现 这里

Spring Web Reactive 的情况更复杂。因为反应流由与执行控制器方法的线程不同的线程计算,所以异常不会自动传播到控制器线程。这意味着 @ExceptionHandler 方法将仅适用于在直接处理请求的线程中抛出的异常。如果我们想使用@ExceptionHandler 特性,流中抛出的异常必须传播回线程。这似乎有点令人失望,但在撰写本文时,Spring 5 仍未发布,因此错误处理可能仍会变得更好。

所以我的问题是如何将异常传播回线程。是否有关于使用 @ExceptionHandler 和 Spring web flux 的好示例或文章?

更新:从 spring.io 看来它是支持的,但仍然缺乏一般的理解

谢谢,

原文由 Evgen 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 766
2 个回答

您可以使用 @ExceptionHandler 注释的方法来处理在执行 WebFlux 处理程序时发生的错误(例如,您的控制器方法)。使用 MVC,您确实还可以处理映射阶段发生的错误,但 WebFlux 并非如此。

回到您的异常传播问题,您分享的文章不准确。

在响应式应用程序中,请求处理确实可以随时从一个线程跳到另一个线程,因此您不能再依赖“每个请求一个线程”模型(想想: ThreadLocal )。

实际上,您不必考虑异常传播或如何管理线程。例如,以下示例应该是等效的:

 @GetMapping("/test")
public Mono<User> showUser() {
  throw new IllegalStateException("error message!");
}

@GetMapping("/test")
public Mono<User> showUser() {
  return Mono.error(new IllegalStateException("error message!"));
}

Reactor 将按照 Reactive Streams 合约中的预期将这些异常作为错误信号发送(有关更多信息,请参阅 “错误处理”文档部分)。

原文由 Brian Clozel 发布,翻译遵循 CC BY-SA 4.0 许可协议

现在可以在 Spring WebFlux 中使用 @ExceptionHandler 以及 @RestControllerAdvice 甚至 @ControllerAdvice

例子:

  1. 添加 webflux 依赖
   <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-webflux</artifactId>
   </dependency>

  1. 创建你的类 ExceptionHandler
    @RestControllerAdvice
   public class ExceptionHandlers {

       private static final Logger LOGGER = LoggerFactory.getLogger(ExceptionHandlers.class);

       @ExceptionHandler(Exception.class)
       @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
       public String serverExceptionHandler(Exception ex) {
           LOGGER.error(ex.getMessage(), ex);
           return ex.getMessage();
       }
   }

  1. 创建控制器
   @GetMapping(value = "/error", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
   public Mono<String> exceptionReturn() {
       return Mono.error(new RuntimeException("test error"));
   }

此处提取的示例:

https://ddcode.net/2019/06/21/spring-5-webflux-exception-handling/

原文由 Eddy Bayonne 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题