异常

如果在请求映射期间发生异常或请求处理器(如 @Controller)抛出异常,DispatcherServlet 会委托给一个 HandlerExceptionResolver bean 链来解决异常并提供替代处理,这通常是错误响应。

下表列出了可用的 HandlerExceptionResolver 实现

表 1. HandlerExceptionResolver 实现
HandlerExceptionResolver 描述

SimpleMappingExceptionResolver

异常类名和错误视图名之间的映射。适用于在浏览器应用程序中渲染错误页面。

DefaultHandlerExceptionResolver

解决 Spring MVC 抛出的异常,并将它们映射到 HTTP 状态码。另请参阅替代的 ResponseEntityExceptionHandler错误响应

ResponseStatusExceptionResolver

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

ExceptionHandlerExceptionResolver

通过调用 @Controller@ControllerAdvice 类中的 @ExceptionHandler 方法来解决异常。参阅 @ExceptionHandler 方法

解析器链

您可以通过在 Spring 配置中声明多个 HandlerExceptionResolver bean,并根据需要设置它们的 order 属性来形成异常解析器链。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 容器会在容器内向配置的 URL(例如 /error)进行 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
© . This site is unofficial and not affiliated with VMware.