异常

@Controller@ControllerAdvice 类可以拥有 @ExceptionHandler 方法来处理控制器方法中的异常。以下示例包含这样一个处理方法: include-code::./SimpleController[indent=0] 异常可以匹配正在传播的顶级异常(即,直接抛出的 IOException),也可以匹配顶级包装器异常中的直接原因(例如,包装在 IllegalStateException 中的 IOException)。 对于匹配的异常类型,最好将目标异常声明为方法参数,如前一个示例所示。或者,注解声明可以缩小匹配的异常类型。我们通常建议在参数签名中尽可能具体,并在 @ControllerAdvice 上声明主要的根异常映射,并设置相应的优先级。 详情请参阅 MVC 部分

WebFlux 中的 @ExceptionHandler 方法支持与 @RequestMapping 方法相同的 方法参数和返回值,但与请求体和 @ModelAttribute 相关的 方法参数除外。

Spring WebFlux 中对 @ExceptionHandler 方法的支持由 @RequestMapping 方法的 HandlerAdapter 提供。有关更多详细信息,请参阅 DispatcherHandler

媒体类型映射

除了异常类型之外,@ExceptionHandler 方法还可以声明可生产的媒体类型。 这允许根据 HTTP 客户端请求的媒体类型(通常在 "Accept" HTTP 请求头中)来细化错误响应。

应用程序可以直接在注解上声明可生产的媒体类型,用于相同的异常类型:

在这里,方法处理相同的异常类型,但不会被拒绝为重复项。 相反,请求 "application/json" 的 API 客户端将收到 JSON 错误,而浏览器将获得 HTML 错误视图。 每个 @ExceptionHandler 注解可以声明多个可生产的媒体类型, 错误处理阶段的内容协商将决定使用哪种内容类型。

方法参数

@ExceptionHandler 方法支持与 @RequestMapping 方法相同的 方法参数, 只是请求体可能已经被消费了。

返回值

@ExceptionHandler 方法支持与 @RequestMapping 方法相同的 返回值