異常

如果在請求對映期間發生異常或請求處理器(如 @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.