我们如何将@ExceptionHandler与Spring Web流量一起使用?

在Spring Web中,我们可以使用Annotation@ExceptionHandler来处理控制器的服务器和客户端错误。

我试着在Web流量控制器上使用这个注释,它仍然适用于我,但经过一些调查,我发现here

Spring Web Active的情况更为复杂。因为 反应流由不同的线程进行计算 执行控制器方法,则不会出现异常 自动传播到控制器线程。这意味着 @ExceptionHandler方法仅对引发的异常有效 在直接处理请求的线程中。抛出的异常 如果我们希望将流传播回线程,则必须将其传播回线程 使用@ExceptionHandler功能。这看起来有点令人失望 但在撰写本文时,Spring5仍未发布,因此 错误处理仍可能会变得更好。

所以我的问题是如何将异常传播回线程。有没有关于使用@ExceptionHandler和Spring Web通量的好例子或文章?

更新: 从spring.io看起来得到了支持,但仍缺乏一般理解

谢谢,

WebFlux

您可以使用@ExceptionHandler带注释的方法来处理推荐答案处理程序(例如,您的控制器方法)执行过程中发生的错误。使用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!"));
}

反应堆将按照反应流合同中的预期将这些异常作为错误信号发送(有关详细信息,请参阅the "error handling" documentation section)。

相关文章