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

异常

如果异常发生在请求映射过程中或请求处理程序抛出(例如 一个@Controller),调度器服务代表链HandlerExceptionResolverBeans 以解决异常并提供替代处理,通常为 错误回复。spring-doc.cadn.net.cn

下表列出了可用的HandlerExceptionResolver实现:spring-doc.cadn.net.cn

表1。HandlerExceptionResolver 实现
HandlerExceptionResolver 描述

SimpleMappingExceptionResolverspring-doc.cadn.net.cn

异常类名称与错误视图名称之间的映射。对渲染非常有用 浏览器应用中的错误页面。spring-doc.cadn.net.cn

DefaultHandlerExceptionResolverspring-doc.cadn.net.cn

解决 Spring MVC 提出的异常,并将其映射到 HTTP 状态码。 另见替代方案ResponseEntityExceptionHandler以及错误响应spring-doc.cadn.net.cn

ResponseStatusExceptionResolverspring-doc.cadn.net.cn

通过@ResponseStatus注释并将其映射到 HTTP 状态 基于注释中的值进行编码。spring-doc.cadn.net.cn

ExceptionHandlerExceptionResolverspring-doc.cadn.net.cn

通过调用@ExceptionHandler在 A 中的方法@Controller或者@ControllerAdvice类。请参见@ExceptionHandler方法spring-doc.cadn.net.cn

解决链

你可以通过声明多个来形成异常解析链HandlerExceptionResolver在你的春季配置中,并设置它们次序根据需要进行属性。 阶数越高,异常解析器的定位时间越晚。spring-doc.cadn.net.cn

合同HandlerExceptionResolver指定它可以返回:spring-doc.cadn.net.cn

MVC 配置会自动声明默认 Spring MVC 的内置解析器 例外情况,对于@ResponseStatus注释例外,以及支持的@ExceptionHandler方法。你可以自定义那个列表,也可以替换它。spring-doc.cadn.net.cn

容器错误页面

如果异常未被任何HandlerExceptionResolver因此,且 留给传播,或者如果响应状态设置为错误状态(即4xx、5xx), Servlet 容器可以渲染默认的错误页面。自定义默认 容器的错误页面,你可以声明错误页面映射web.xml. 以下示例展示了如何实现:spring-doc.cadn.net.cn

<error-page>
	<location>/error</location>
</error-page>

鉴于上述例子,当异常出现或响应出现错误状态时, Servlet 容器在容器内对配置的 URL 发送 ERROR (例如,/错误).然后由调度器服务,可能正在映射它 转给@Controller可以实现为返回带有模型的错误视图名称 或者像下面的示例所示,可以渲染JSON响应:spring-doc.cadn.net.cn

@RestController
public class ErrorController {

	@RequestMapping(path = "/error")
	public Map<String, Object> handle(HttpServletRequest request) {
		Map<String, Object> map = new HashMap<>();
		map.put("status", request.getAttribute("jakarta.servlet.error.status_code"));
		map.put("reason", request.getAttribute("jakarta.servlet.error.message"));
		return map;
	}
}
@RestController
class ErrorController {

	@RequestMapping(path = ["/error"])
	fun handle(request: HttpServletRequest): Map<String, Any> {
		val map = HashMap<String, Any>()
		map["status"] = request.getAttribute("jakarta.servlet.error.status_code")
		map["reason"] = request.getAttribute("jakarta.servlet.error.message")
		return map
	}
}
Servlet API 不提供在 Java 中创建错误页面映射的方法。您可以 但同时使用A。WebApplicationInitializer以及一个极小web.xml.