Spring Boot 全局异常捕获 ControllerAdvice 无法捕获 过滤器(Filter)和拦截器(Interceptor)中的异常

Spring Boot 全局异常捕获 ControllerAdvice 无法捕获 过滤器(Filter)和拦截器(Interceptor)中的异常

💡 原文中文,约1900字,阅读约需5分钟。
📝

内容提要

在Spring Boot中,@RestControllerAdvice和@ControllerAdvice用于全局捕获异常,但无法捕获过滤器中抛出的异常。要捕获过滤器中的异常,需要在过滤器中将异常传递到后续处理的Controller。示例代码展示了如何在过滤器中捕获ExpiredJwtException,并通过Dispatcher转发到特定Controller,以便ControllerAdvice能够处理该异常。

🎯

关键要点

  • 在Spring Boot中,@RestControllerAdvice和@ControllerAdvice用于全局捕获异常,但无法捕获过滤器中抛出的异常。
  • 过滤器的执行顺序是过滤器->拦截器->ControllerAdvice,因此在过滤器中抛出的异常无法被ControllerAdvice捕获。
  • 要捕获过滤器中的异常,需要在过滤器中将异常传递到后续处理的Controller,而不是直接抛出异常。
  • 示例代码展示了如何在过滤器中捕获ExpiredJwtException,并通过Dispatcher转发到特定Controller,以便ControllerAdvice能够处理该异常。

延伸问答

在Spring Boot中,如何使用@ControllerAdvice捕获异常?

可以使用@RestControllerAdvice和@ControllerAdvice来全局捕获异常,但它们无法捕获过滤器中抛出的异常。

为什么@ControllerAdvice无法捕获过滤器中的异常?

因为过滤器的执行顺序是过滤器->拦截器->ControllerAdvice,过滤器中抛出的异常在ControllerAdvice执行之前就已经停止了执行。

如何在过滤器中处理ExpiredJwtException异常?

在过滤器中捕获ExpiredJwtException后,可以将异常对象设置到请求属性中,并通过Dispatcher转发到特定的Controller。

在过滤器中捕获异常后,如何将其传递给Controller?

可以通过设置请求属性并使用Dispatcher转发到一个接收异常的Controller来传递异常。

如何实现一个接收异常的Controller?

可以创建一个Controller,使用@RequestMapping注解定义一个路径,并在该路径的方法中从请求属性中取出异常并重新抛出。

如何使用@RestControllerAdvice处理ExpiredJwtException?

可以在@RestControllerAdvice中定义一个@ExceptionHandler方法,专门处理ExpiredJwtException并返回相应的ApiResult。

➡️

继续阅读