Якщо виняток виникає під час відображення запиту або генерується з обробника запиту (наприклад, анотованого @Controller
), DispatcherServlet
делегує повноваження ланцюжку бінів HandlerExceptionResolver
для розпізнавання винятку та забезпечення альтернативної обробки, яка зазвичай є повідомленням про помилку.
У наступній таблиці перераховані доступні реалізації HandlerExceptionResolver
:
HandlerExceptionResolver |
Опис |
---|---|
|
Зіставлення між іменами класів винятків та іменами подання помилок. Використовується для візуалізації сторінок помилок у програмі браузера. |
Розпізнає винятки, викликані Spring MVC, та відображає їх на коди стану HTTP. Також альтернативний |
|
|
Розпізнає винятки з анотацією |
|
Розпізнає винятки шляхом виклику методу, позначеного анотацією |
Ланцюжок розпізнавачів
Ти можеш сформувати ланцюжок розпізнавачів винятків, оголосивши кілька бінів HandlerExceptionResolver
у конфігурації Spring і налаштувавши їх властивості order
за необхідності. Чим вище властивість порядку, тим далі розташовується виключник.
У контракті HandlerExceptionResolver
задається, що він може повертати:
-
ModelAndView
, що вказує на подання помилки. -
Порожній
ModelAndView
, якщо виняток оброблено всередині розпізнавача. -
null
, якщо виняток залишається нерозпізнаним, для подальших спроб, що робляться розпізнавальниками, але якщо виняток зрештою залишається, то він допускається до контейнера сервлета.
Конфігурація MVC автоматично оголошує вбудовані розпізнавачі для винятків Spring MVC за замовчуванням, для анотованих @ResponseStatus
винятків та підтримки методів, анотованих @ExceptionHandler
. Цей список можна змінити або замінити.
Сторінка помилки контейнера
Якщо виняток залишається нерозпізнаним будь-яким HandlerExceptionResolver
і, отже, продовжує поширюватися, або якщо в статусі відповіді встановлено стан помилки (тобто 4xx, 5xx), контейнери сервлетів можуть візуалізувати сторінку помилки за замовчуванням на HTML. Щоб налаштувати сторінку помилок контейнера за замовчуванням, можна оголосити відображення сторінки помилок у web.xml
. У цьому прикладі показано, як це зробити:
<error-page>
<location>/error</location>
</error-page>
Враховуючи попередній приклад, якщо виникає виняток або відповідь має стан помилки, контейнер сервлетів виконує всередині контейнера відправку ERROR на конфігуровану URL-адресу (наприклад, /error
). Потім все це обробляється DispatcherServlet
шляхом його можливого відображення на анотацію @Controller
, яка може бути реалізована для повернення імені подання помилки з моделлю або для виведення відповіді у форматі JSON, як показано у наступному прикладі:
@RestController
public class ErrorController {
@RequestMapping(path = "/error")
public Map<String, Object> handle(HttpServletRequest request) {
Map<String, Object> map = new HashMap<String, Object>();
map.put("status", request.getAttribute("javax.servlet.error.status_code"));
map.put("reason", request.getAttribute("javax.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("javax.servlet.error.status_code")
map["reason"] = request.getAttribute("javax.servlet.error.message")
return map
}
}
WebApplicationInitializer
, так і простий web.xml
.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ