Кастомизация страницы ошибок в Spring Boot

Программное обеспечение иногда даёт сбои. Даже лучшие приложения в какой‑то момент столкнутся с ошибками, поэтому у каждого приложения должны быть механизмы обработки ошибок.
Spring Boot по умолчанию предоставляет Whitelabel‑страницу ошибки как часть автоконфигурации. Однако обычно разработчики заменяют эту страницу своей. В этой статье описано, как создать и безопасно кастомизировать страницу ошибок для приложений Spring Boot и как обеспечить понятный UX для разных типов клиентов.
Стандартная Whitelabel‑страница ошибок Spring Boot
Когда приложение Spring Boot сталкивается с ошибкой, фреймворк перенаправляет запрос на URL /error. Если по этому пути не найден view, отображается Whitelabel‑страница ошибки:

Whitelabel показывает дату и время ошибки с часовым поясом, тип ошибки и код статуса. В примере отображается 404, потому что в приложении нет маппинга для пути /products.
Большая часть информации на Whitelabel берётся из набора атрибутов ошибки. Представления ошибок в Spring Boot имеют доступ к следующим атрибутам:
- error: причина ошибки (короткое описание).
- timestamp: дата и время возникновения ошибки.
- status: код статуса HTTP.
- exception: имя класса корневого исключения (если ошибка вызвана исключением).
- message: сообщение исключения (при наличии).
- errors: результаты BindingResult (при валидации форм).
- trace: стек‑трэйс исключения (детально, для логов).
- path: URL, по которому произошла ошибка.
Создание страницы ошибок с Thymeleaf
В приложении должен быть один шаблон ошибки, размещённый в каталоге templates. Расширение файла зависит от движка шаблонов: для JSP — error.jsp, для Thymeleaf — error.html и т.д. В примере используется Thymeleaf, поэтому файл называется error.html и находится в src/main/resources/templates.
Файл error.html
Error
Этот шаблон выполняет важные задачи: сообщает об ошибке, показывает путь запроса, указывает код статуса и краткое объяснение через атрибут error. При наличии исключения отображается сообщение, а ссылка внизу возвращает пользователя на главную страницу. В шаблоне используются CSS и изображения для стилизации.

Сделайте страницу удобной и безопасной
Основная цель страницы ошибки — уведомить пользователя о проблеме, но при этом она остаётся частью интерфейса приложения и должна быть удобной.
- Показывайте только нужные атрибуты: path, status, короткое сообщение. trace и детали стека не нужны пользователю.
- Не раскрывайте внутренние данные и PII. Используйте общие фразы, а подробности — в логах на сервере.
- Для ошибок 4xx дайте понятное объяснение и инструкцию (проверьте URL, войдите в систему). Для 5xx — предложите перезагрузить страницу и сообщите, что команда получила уведомление.
Важно: храните полные трассировки только в защищённых логах. На странице пользователя показывайте упрощённую информацию.
Альтернативные подходы
- Статичная HTML‑страница: положите error.html в static/ — подойдёт для простых сайтов без шаблонизатора.
- Другие шаблонизаторы: Freemarker, Mustache, JSP — Spring Boot найдёт error.* автоматически.
- Разделение для API и UI: для браузерных запросов отдавайте HTML, для API — JSON. Используйте ContentNegotiation или контроллеры с @ControllerAdvice для REST.
Пример простого обработчика для REST‑API, который возвращает JSON вместо HTML:
@ControllerAdvice
public class RestExceptionHandler extends ResponseEntityExceptionHandler {
@ExceptionHandler(Exception.class)
protected ResponseEntityКогда кастомизация может не сработать
- Клиент ожидает JSON, а вы возвращаете HTML — приложение клиента сломается. Разделяйте обработку по типу запроса.
- Если шаблон лежит в неправильной папке (не в resources/templates для Thymeleaf), Spring будет показывать Whitelabel.
- Если ваш веб‑сервер (NGINX, CDN) обрабатывает ошибки раньше приложения, шаблон не отобразится.
Мини‑методика внедрения
- Поместите error.html в src/main/resources/templates.
- Покройте кейсы: 404, 403, 500. Создайте дружелюбные сообщения.
- Для API добавьте @ControllerAdvice, возвращающий JSON.
- Логируйте полные детали на сервере и свяжите id инцидента с сообщением на фронте.
- Тестируйте: UI (браузер), API (curl/postman), интеграционные тесты.
Check‑лист ролей
- Разработчик:
- Шаблон размещён в resources/templates.
- Проверены локализации сообщений.
- Добавлен unit/integration тест.
- DevOps:
- Логи централизованы (ELK, Splunk или подобное).
- CDN/NGINX не блокирует отображение кастомной страницы.
- Security:
- На странице нет stack trace и PII.
- Логи доступны только авторизованному персоналу.
- UX:
- Сообщение понятно и содержит путь к действию (обновить, связаться с поддержкой).
Шпаргалка конфигурации
- Стандартный путь шаблона: src/main/resources/templates/error.html
- Для отключения Whitelabel (при явной подстановке своего обработчика): server.error.whitelabel.enabled=false
- Контент‑negotiation: убедитесь, что Accept заголовки корректно обрабатываются при выборе HTML vs JSON
Критерии приёмки
- Пользователь видит понятное сообщение об ошибке.
- Для API возвращается корректный JSON с полями timestamp, status, error, message, path.
- Стек‑трейсы не видны в UI, но есть в логах с уникальным id инцидента.
- Тесты покрывают 404 и 500 сценарии.
Безопасность и приватность
- Не выводите trace и internal exception messages на публичную страницу.
- Не включайте в сообщения пользовательские данные (PII). Вместо этого логируйте их в защищённом хранилище.
- Ограничьте доступ к логам и внедрите уведомления о 5xx ошибках.
Примеры и сравнение подходов
| Сценарий | HTML (Thymeleaf) | JSON (REST) |
|---|---|---|
| Браузерный сайт | Подходит — отображает стиль и ссылки | Неподходящт — пользователь увидит необработанный JSON |
| SPA/JS клиент | Подходит, если SPA ожидает HTML | Часто требуется JSON для клиентской обработки |
| Микросервис API | Не рекомендуется | Рекомендуется — структурированный ответ |
Итог
Кастомизация страницы ошибок в Spring Boot — простая, но важная часть качества приложения. Поместите единый шаблон ошибок в resources/templates для HTML‑клиентов и реализуйте @ControllerAdvice для API. Не раскрывайте внутренние детали пользователям, логируйте их и тестируйте обработку ошибок.
Ключевые шаги: создать шаблон error.html, различать HTML/JSON клиенты, логировать детали, обеспечить понятный UX и защиту приватных данных.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента