对于最新稳定版本,请使用Spring Framework 7.0.1spring-doc.cadn.net.cn

异常

@Controller@ControllerAdvice类可以有@ExceptionHandler用于处理控制器方法异常的方法,如下示例所示:spring-doc.cadn.net.cn

@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版本开始,这可以匹配 在任意原因层面上,而此前仅考虑直接原因。spring-doc.cadn.net.cn

对于匹配异常类型,最好将目标异常声明为方法参数, 如前例所示。当多个异常方法匹配时,根异常匹配为 通常比原因例外匹配更受青睐。更具体地说,是ExceptionDepthComparator用于根据异常与抛出异常类型的深度进行排序。spring-doc.cadn.net.cn

或者,注释声明可以缩小例外类型以匹配, 如下示例所示:spring-doc.cadn.net.cn

@ExceptionHandler({FileSystemException.class, RemoteException.class})
public ResponseEntity<String> handle(IOException ex) {
	// ...
}
@ExceptionHandler(FileSystemException::class, RemoteException::class)
fun handle(ex: IOException): ResponseEntity<String> {
	// ...
}

你甚至可以使用一个带有非常通用参数签名的特定异常类型列表, 如下示例所示:spring-doc.cadn.net.cn

@ExceptionHandler({FileSystemException.class, RemoteException.class})
public ResponseEntity<String> handle(Exception ex) {
	// ...
}
@ExceptionHandler(FileSystemException::class, RemoteException::class)
fun handle(ex: Exception): ResponseEntity<String> {
	// ...
}

根异常匹配和原因异常匹配的区别可能令人惊讶。spring-doc.cadn.net.cn

IOException如前所述变体,该方法通常称为 实际FileSystemException远程例外实例为论元, 因为它们都从IOException.然而,如果存在这样的匹配 例外通过包装异常传播,而包装器本身是IOException, 传入的异常实例就是那个包装例外。spring-doc.cadn.net.cn

handle(例外)变体。这是 在包裹场景中,总是带着包装例外被调用,且 实际匹配的例外可以通过以下方式找到例如.getCause()那就这样吧。 传入例外是实际的FileSystemException远程例外仅当这些作为顶层例外抛出时。spring-doc.cadn.net.cn

我们通常建议您在论点签名中尽可能具体, 减少根除类型与原因异常类型之间不匹配的可能性。 考虑将多重匹配方法拆解成个体@ExceptionHandler每种方法通过签名匹配单一特定异常类型。spring-doc.cadn.net.cn

在多重——@ControllerAdvice安排,我们建议声明您的主根例外 映射@ControllerAdvice优先级并相应排序。作为根 例外匹配优先于原因,这在给定方法之间定义 控制器或@ControllerAdvice类。这意味着优先级更高的原因匹配@ControllerAdvice豆子优先于优先级较低的匹配(例如根匹配)@ControllerAdvice豆。spring-doc.cadn.net.cn

最后但同样重要的是,一个@ExceptionHandler方法实现可以选择 支持 通过将异常实例重新抛入原始形式来处理。 这在你只关注根级匹配或 在无法静态确定的特定上下文中匹配。一个重新投掷的 异常通过剩余的解析链传播,就像 所给@ExceptionHandler方法本来就不匹配。spring-doc.cadn.net.cn

支持@ExceptionHandler春季MVC的方法建立在调度器服务level,HandlerExceptionResolver 机制。spring-doc.cadn.net.cn

方法参数

@ExceptionHandler方法支持以下论证:spring-doc.cadn.net.cn

方法论证 描述

例外类型spring-doc.cadn.net.cn

以获取提出的例外情况。spring-doc.cadn.net.cn

HandlerMethodspring-doc.cadn.net.cn

为了访问引发异常的控制器方法。spring-doc.cadn.net.cn

WebRequest,NativeWebRequestspring-doc.cadn.net.cn

无需直接访问请求参数及请求和会话属性的通用访问 使用 Servlet API。spring-doc.cadn.net.cn

jakarta.servlet.ServletRequest,jakarta.servlet.ServletResponse。spring-doc.cadn.net.cn

选择任何特定的请求或响应类型(例如,ServletRequestHttpServletRequest或者说是Spring的多部分请求MultipartHttpServletRequest).spring-doc.cadn.net.cn

jakarta.servlet.http.HttpSessionspring-doc.cadn.net.cn

强制执行会话的存在。因此,这样的论证永远不会成立.
请注意,会话访问并非线程安全。考虑设置
RequestMappingHandlerAdapter实例同步OnSession旗帜变为true如果是多重的话 请求允许同时访问会话。spring-doc.cadn.net.cn

java.security.Principalspring-doc.cadn.net.cn

当前认证用户——可能是特定的用户主要如果已知实现类。spring-doc.cadn.net.cn

Http方法spring-doc.cadn.net.cn

请求的HTTP方法。spring-doc.cadn.net.cn

java.util.Localespring-doc.cadn.net.cn

当前请求地点,由最具体的决定LocaleResolver可得 — 在 效果,配置LocaleResolverLocaleContextResolver.spring-doc.cadn.net.cn

java.util.TimeZone,java.time.ZoneIdspring-doc.cadn.net.cn

与当前请求相关的时区,由LocaleContextResolver.spring-doc.cadn.net.cn

java.io.OutputStream,java.io.writerspring-doc.cadn.net.cn

用于访问由 Servlet API 提供的原始响应体。spring-doc.cadn.net.cn

java.util.Map,org.springframework.ui.Model,org.springframework.ui.ModelMapspring-doc.cadn.net.cn

用于获取错误响应的模型。总是空的。spring-doc.cadn.net.cn

重定向属性spring-doc.cadn.net.cn

指定在重定向时使用的属性——(即要附加到查询后) 字符串)和闪存属性,在重定向后临时存储,直到请求发出。 参见重定向属性闪光属性spring-doc.cadn.net.cn

@SessionAttributespring-doc.cadn.net.cn

对于访问任何会话属性,与存储在 会议是班级层面的结果@SessionAttributes声明。 看@SessionAttribute更多细节请阅读。spring-doc.cadn.net.cn

@RequestAttributespring-doc.cadn.net.cn

用于访问请求属性。看@RequestAttribute更多细节请阅读。spring-doc.cadn.net.cn

回报值

@ExceptionHandler方法支持以下返回值:spring-doc.cadn.net.cn

返回价值 描述

@ResponseBodyspring-doc.cadn.net.cn

返回值通过以下方式转换HttpMessage转换器实例并写入 响应。看@ResponseBody.spring-doc.cadn.net.cn

HttpEntity<B>,ResponseEntity<B>spring-doc.cadn.net.cn

返回值指定完整的响应(包括HTTP头和正文) 通过HttpMessage转换器实例并书写回应。 参见ResponseEntityspring-doc.cadn.net.cn

ErrorResponsespring-doc.cadn.net.cn

为了在正文中呈现带有详细信息的RFC 7807错误响应, 参见错误响应spring-doc.cadn.net.cn

问题详情spring-doc.cadn.net.cn

为了在正文中呈现带有详细信息的RFC 7807错误响应, 参见错误响应spring-doc.cadn.net.cn

字符串spring-doc.cadn.net.cn

一个视图名称,需解析为ViewResolver实现并与 隐式模型——通过命令对象和确定@ModelAttribute方法。 处理方法还可以通过声明论证(前面描述)。spring-doc.cadn.net.cn

视图spring-doc.cadn.net.cn

一个视图用于与隐式模型一起渲染的实例——确定 通过命令对象和@ModelAttribute方法。处理方法也可以 通过声明 a 来程序丰富模型论证(前文所述)。spring-doc.cadn.net.cn

java.util.Map,org.springframework.ui.Modelspring-doc.cadn.net.cn

将属性添加到隐式模型中,视图名称被隐式确定 通过一个RequestToViewNameTranslator.spring-doc.cadn.net.cn

@ModelAttributespring-doc.cadn.net.cn

一个需要添加到模型中的属性,视图名称通过以下方式隐式确定 一个RequestToViewNameTranslator.spring-doc.cadn.net.cn

注意@ModelAttribute是可选的。参见末尾的“任何其他返回值” 这张桌子。spring-doc.cadn.net.cn

模型与视图对象spring-doc.cadn.net.cn

视图和模型属性,以及可选的响应状态。spring-doc.cadn.net.cn

无效spring-doc.cadn.net.cn

一个具有无效返回类型(或返回值)被认为完全具有 如果回复也有Servlet响应输出流论元,或 一个@ResponseStatus注解。如果控制器做了正信号,情况也一样ETag最后修改时间戳检查(详情见控制器)。spring-doc.cadn.net.cn

如果以上都不成立,则无效返回类型也可以表示“无响应体”,对 REST 控制器或默认的视图名称选择用于 HTML 控制器。spring-doc.cadn.net.cn

任何其他返回值spring-doc.cadn.net.cn

如果返回值与上述任何一项都不匹配,且不是简单类型(由 BeanUtils#isSimpleProperty 确定), 默认情况下,它被视为需要添加到模型中的模型属性。如果它是单类型, 问题至今未解。spring-doc.cadn.net.cn