如何在 Spring Exception Handler 中处理包装的异常?

Did*_*r L 5 java spring exception-handling spring-mvc

上下文

在我们的应用程序中,我们已经开始使用,CompletableFuture但是当我们在现有代码中引入它时,我们有时必须调用get()(or join()) 方法。

这些方法将过程中发生的任何异常包装到一个ExecutionException(分别为 a CompletionException)中。

问题

默认情况下,Spring Web MVC 将通过返回 500 HTTP 状态来处理这些异常。相反,我们希望解开它们的原因,并将它们的处理委托给相应的自定义异常处理程序。

在 spring mvc处理包装异常时所说的相反,重新抛出原因不起作用¹,Spring 只是用它记录调试消息

另一方面,如何在 Spring @ExceptionHandler 中重新抛出异常作为 @ResponseStatus 注释的异常?太具体了,因为它假设我们事先知道异常的原因以及如何处理它。

我们找到的解决方案是定义 a @ControllerAdvice,将原因的处理委托回HandlerExceptionResolver如下所示:

@Autowired
HandlerExceptionResolver handlerExceptionResolver;

@ExceptionHandler(ExecutionException.class)
public ModelAndView handle(HttpServletRequest request, HttpServletResponse response, ExecutionException e) {
   return handlerExceptionResolver.resolveException(request, response, null, (Exception) e.getCause());
}
Run Code Online (Sandbox Code Playgroud)

然而,这看起来有点像黑客。我担心它可能会在 Spring 的未来版本中中断,或者由于某种原因HandlerExceptionResolver在上下文中不止一个。

这样做的正确方法是什么?

¹编辑:这曾经是该问题的公认答案,但在此期间似乎已被删除。