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

异常

如果在请求映射期间发生异常或从请求处理器(例如 @Controller)抛出异常,DispatcherServlet 会委托给一系列的 HandlerExceptionResolver bean 来解析异常并提供替代处理,通常是错误响应。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 方法在 @Controller 或一个 @ControllerAdvice 类中解决异常。请参见 @ExceptionHandler 方法spring-doc.cadn.net.cn

解析器链

你可以通过在你的Spring配置中声明多个HandlerExceptionResolver beans并按需设置它们的order属性来形成一个异常解析器链。 order属性越高,异常解析器的位置越靠后。spring-doc.cadn.net.cn

0 的契约规定它可以返回:spring-doc.cadn.net.cn

The MVC配置 自动声明了用于默认Spring MVC异常的内置解析器,用于@ResponseStatus注解异常,以及对@ExceptionHandler方法的支持。您可以自定义该列表或替换它。spring-doc.cadn.net.cn

容器错误页面

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

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

根据前面的例子,当异常冒泡或响应具有错误状态时,Servlet容器会在容器内部向配置的URL进行ERROR调度 (例如,/error)。然后由DispatcherServlet处理,可能将其映射到一个@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 中创建错误页面映射的方法。但是,您可以使用 WebApplicationInitializer 和一个最小的 web.xml