Якщо виняток виникає під час відображення запиту або генерується з обробника запиту (наприклад, анотованого @Controller), DispatcherServlet делегує повноваження ланцюжку бінів HandlerExceptionResolver для розпізнавання винятку та забезпечення альтернативної обробки, яка зазвичай є повідомленням про помилку.

У наступній таблиці перераховані доступні реалізації HandlerExceptionResolver:

Таблиця 2. Реалізації HandlerExceptionResolver
HandlerExceptionResolver Опис

SimpleMappingExceptionResolver

Зіставлення між іменами класів винятків та іменами подання помилок. Використовується для візуалізації сторінок помилок у програмі браузера.

DefaultHandlerExceptionResolver

Розпізнає винятки, викликані Spring MVC, та відображає їх на коди стану HTTP. Також альтернативний ResponseEntityExceptionHandler.

ResponseStatusExceptionResolver

Розпізнає винятки з анотацією @ResponseStatus та відображає їх на коди статусу HTTP на основі значення в анотації.

ExceptionHandlerExceptionResolver

Розпізнає винятки шляхом виклику методу, позначеного анотацією @ExceptionHandler, у класі з анотацією @Controller або анотацією @ControllerAdvice.

Ланцюжок розпізнавачів

Ти можеш сформувати ланцюжок розпізнавачів винятків, оголосивши кілька бінів 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, як показано у наступному прикладі:

Java
@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;
    }
}
Kotlin
@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
    }
}
Servlet API не забезпечує можливість відображення сторінок помилок на Java. Однак можна використовувати як WebApplicationInitializer, так і простий web.xml.