在 spring web 中,我们可以使用注解 @ExceptionHandler 来处理控制器的服务器和客户端错误。
我尝试将此注释与 web-flux 控制器一起使用,它仍然对我有用,但经过一些调查后我发现 这里
Spring Web Reactive 的情况更复杂。因为反应流由与执行控制器方法的线程不同的线程计算,所以异常不会自动传播到控制器线程。这意味着 @ExceptionHandler 方法将仅适用于在直接处理请求的线程中抛出的异常。如果我们想使用@ExceptionHandler 特性,流中抛出的异常必须传播回线程。这似乎有点令人失望,但在撰写本文时,Spring 5 仍未发布,因此错误处理可能仍会变得更好。
所以我的问题是如何将异常传播回线程。是否有关于使用 @ExceptionHandler 和 Spring web flux 的好示例或文章?
更新:从 spring.io 看来它是支持的,但仍然缺乏一般的理解
谢谢,
原文由 Evgen 发布,翻译遵循 CC BY-SA 4.0 许可协议
您可以使用
@ExceptionHandler
注释的方法来处理在执行 WebFlux 处理程序时发生的错误(例如,您的控制器方法)。使用 MVC,您确实还可以处理映射阶段发生的错误,但 WebFlux 并非如此。回到您的异常传播问题,您分享的文章不准确。
在响应式应用程序中,请求处理确实可以随时从一个线程跳到另一个线程,因此您不能再依赖“每个请求一个线程”模型(想想:
ThreadLocal
)。实际上,您不必考虑异常传播或如何管理线程。例如,以下示例应该是等效的:
Reactor 将按照 Reactive Streams 合约中的预期将这些异常作为错误信号发送(有关更多信息,请参阅 “错误处理”文档部分)。