异常

如果在请求映射期间发生异常或从请求处理程序(如@Controller)抛出异常,则DispatcherServlet会委托给一系列HandlerExceptionResolver bean来解析异常并提供替代处理,通常是错误响应。

以下表格列出了可用的HandlerExceptionResolver实现:

表1. HandlerExceptionResolver实现
HandlerExceptionResolver 描述

SimpleMappingExceptionResolver

异常类名与错误视图名称之间的映射。用于在浏览器应用程序中呈现错误页面。

DefaultHandlerExceptionResolver

解析Spring MVC引发的异常并将其映射到HTTP状态码。另请参阅替代的ResponseEntityExceptionHandler错误响应

ResponseStatusExceptionResolver

解析带有@ResponseStatus注解的异常,并根据注解中的值将其映射到HTTP状态码。

ExceptionHandlerExceptionResolver

通过调用@ExceptionHandler方法在@Controller@ControllerAdvice类中解析异常。请参阅@ExceptionHandler方法

解析器链

HandlerExceptionResolver bean并根据需要设置其 order属性来形成异常解析器链。属性值越高,异常解析器的位置越靠后。

HandlerExceptionResolver的契约规定它可以返回:

  • ModelAndView

  • ModelAndView

  • null,供后续解析器尝试处理,如果异常最终保留在最后,则允许其上升到Servlet容器。

MVC配置会自动声明内置解析器,用于默认Spring MVC异常,用于@ResponseStatus注解的异常以及支持@ExceptionHandler方法。您可以自定义该列表或替换它。

容器错误页面

如果异常未被任何HandlerExceptionResolver解决,因此被留待传播,或者如果响应状态设置为错误状态(即4xx、5xx),Servlet容器可以在HTML中呈现默认错误页面。要自定义容器的默认错误页面,您可以在web.xml中声明错误页面映射。以下示例显示如何操作:

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

根据上述示例,当异常冒泡或响应具有错误状态时,Servlet容器在容器内进行ERROR分派到配置的URL(例如,/error)。然后由DispatcherServlet处理,可能将其映射到@Controller,该控制器可以实现返回带有模型的错误视图名称或呈现JSON响应,如以下示例所示:

  • Java

  • Kotlin

@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