異常
如果在請求對映期間發生異常或請求處理器(如 @Controller)丟擲異常,DispatcherServlet 會委託給一個 HandlerExceptionResolver bean 鏈來解決異常並提供替代處理,這通常是錯誤響應。
下表列出了可用的 HandlerExceptionResolver 實現
HandlerExceptionResolver |
描述 |
|---|---|
|
異常類名和錯誤檢視名之間的對映。適用於在瀏覽器應用程式中渲染錯誤頁面。 |
解決 Spring MVC 丟擲的異常,並將它們對映到 HTTP 狀態碼。另請參閱替代的 |
|
|
解決帶有 |
|
透過呼叫 |
解析器鏈
您可以透過在 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。 |