|
对于最新稳定版本,请使用Spring Framework 7.0.1! |
异常
@Controller@ControllerAdvice类可以有@ExceptionHandler用于处理控制器方法异常的方法,如下示例所示:
-
Java
-
Kotlin
@Controller
public class SimpleController {
// ...
@ExceptionHandler
public ResponseEntity<String> handle(IOException ex) {
// ...
}
}
@Controller
class SimpleController {
// ...
@ExceptionHandler
fun handle(ex: IOException): ResponseEntity<String> {
// ...
}
}
异常可能与正在传播的顶层异常匹配(例如直接异常)IOException被抛弃)或在包装例外内的嵌套原因(例如:
一IOException包裹在非法州例外).从5.3版本开始,这可以匹配
在任意原因层面上,而此前仅考虑直接原因。
对于匹配异常类型,最好将目标异常声明为方法参数,
如前例所示。当多个异常方法匹配时,根异常匹配为
通常比原因例外匹配更受青睐。更具体地说,是ExceptionDepthComparator用于根据异常与抛出异常类型的深度进行排序。
或者,注释声明可以缩小例外类型以匹配, 如下示例所示:
-
Java
-
Kotlin
@ExceptionHandler({FileSystemException.class, RemoteException.class})
public ResponseEntity<String> handle(IOException ex) {
// ...
}
@ExceptionHandler(FileSystemException::class, RemoteException::class)
fun handle(ex: IOException): ResponseEntity<String> {
// ...
}
你甚至可以使用一个带有非常通用参数签名的特定异常类型列表, 如下示例所示:
-
Java
-
Kotlin
@ExceptionHandler({FileSystemException.class, RemoteException.class})
public ResponseEntity<String> handle(Exception ex) {
// ...
}
@ExceptionHandler(FileSystemException::class, RemoteException::class)
fun handle(ex: Exception): ResponseEntity<String> {
// ...
}
|
根异常匹配和原因异常匹配的区别可能令人惊讶。 在 在 |
我们通常建议您在论点签名中尽可能具体,
减少根除类型与原因异常类型之间不匹配的可能性。
考虑将多重匹配方法拆解成个体@ExceptionHandler每种方法通过签名匹配单一特定异常类型。
在多重——@ControllerAdvice安排,我们建议声明您的主根例外
映射@ControllerAdvice优先级并相应排序。作为根
例外匹配优先于原因,这在给定方法之间定义
控制器或@ControllerAdvice类。这意味着优先级更高的原因匹配@ControllerAdvice豆子优先于优先级较低的匹配(例如根匹配)@ControllerAdvice豆。
最后但同样重要的是,一个@ExceptionHandler方法实现可以选择 支持
通过将异常实例重新抛入原始形式来处理。
这在你只关注根级匹配或
在无法静态确定的特定上下文中匹配。一个重新投掷的
异常通过剩余的解析链传播,就像
所给@ExceptionHandler方法本来就不匹配。
支持@ExceptionHandler春季MVC的方法建立在调度器服务level,HandlerExceptionResolver 机制。
方法参数
@ExceptionHandler方法支持以下论证:
| 方法论证 | 描述 |
|---|---|
例外类型 |
以获取提出的例外情况。 |
|
为了访问引发异常的控制器方法。 |
|
无需直接访问请求参数及请求和会话属性的通用访问 使用 Servlet API。 |
|
选择任何特定的请求或响应类型(例如, |
|
强制执行会话的存在。因此,这样的论证永远不会成立 |
|
当前认证用户——可能是特定的用户 |
|
请求的HTTP方法。 |
|
当前请求地点,由最具体的决定 |
|
与当前请求相关的时区,由 |
|
用于访问由 Servlet API 提供的原始响应体。 |
|
用于获取错误响应的模型。总是空的。 |
|
指定在重定向时使用的属性——(即要附加到查询后) 字符串)和闪存属性,在重定向后临时存储,直到请求发出。 参见重定向属性和闪光属性。 |
|
对于访问任何会话属性,与存储在
会议是班级层面的结果 |
|
用于访问请求属性。看 |
回报值
@ExceptionHandler方法支持以下返回值:
| 返回价值 | 描述 |
|---|---|
|
返回值通过以下方式转换 |
|
返回值指定完整的响应(包括HTTP头和正文)
通过 |
|
为了在正文中呈现带有详细信息的RFC 7807错误响应, 参见错误响应 |
|
为了在正文中呈现带有详细信息的RFC 7807错误响应, 参见错误响应 |
|
一个视图名称,需解析为 |
|
一个 |
|
将属性添加到隐式模型中,视图名称被隐式确定
通过一个 |
|
一个需要添加到模型中的属性,视图名称通过以下方式隐式确定
一个 注意 |
|
视图和模型属性,以及可选的响应状态。 |
|
一个具有 如果以上都不成立,则 |
任何其他返回值 |
如果返回值与上述任何一项都不匹配,且不是简单类型(由 BeanUtils#isSimpleProperty 确定), 默认情况下,它被视为需要添加到模型中的模型属性。如果它是单类型, 问题至今未解。 |