🚑 Global Exception Handling: Красиво падаем
Представьте: пользователь запрашивает ID, которого нет.
🔴 Плохой сценарий: Сервер выплевывает стэктрейс на 500 строк, раскрывая внутренности БД. Статус 500 Internal Server Error. Клиент в шоке.
🔴 Хороший сценарий: Клиент получает аккуратный JSON:
Раньше, чтобы добиться хорошего сценария, приходилось писать
В Spring Boot есть элегантное решение -
🛡 Что это такое?
Это перехватчик (Interceptor), который работает по принципу Аспектно-Ориентированного Программирования (AOP). Он "сидит" над всеми вашими контроллерами и ловит исключения, которые вылетели из них, прежде чем они дойдут до пользователя.
🛠 Как настроить? (3 шага)
1. Создаем DTO для ошибки
Нам нужен красивый формат ответа, чтобы фронтенд всегда знал, чего ожидать.
2. Создаем Глобальный Обработчик
Используем аннотацию
Внутри класса мы пишем методы-обработчики с аннотацией
3. Бросаем исключения в Сервисе
Теперь в коде сервиса можно не бояться и просто бросать ошибки. Обработчик их поймает.
⚡ Почему это круто?
1. Чистота кода: В контроллерах нет
2. Единообразие: Весь API возвращает ошибки в одинаковом формате.
3. Безопасность: Вы контролируете, какой текст ошибки увидит пользователь, и скрываете системные детали.
🔥 Итог
🔴 Не используйте
🔴 Создайте один класс с
🔴 Маппите Java-исключения (
#SpringBoot #Java #ExceptionHandling #BestPractices
📲 Мы в MAX
👉@BookJava
Представьте: пользователь запрашивает ID, которого нет.
{"status": 404, "message": "User not found"}.Раньше, чтобы добиться хорошего сценария, приходилось писать
try-catch в каждом методе контроллера. Это ужасно.В Spring Boot есть элегантное решение -
@ControllerAdvice.🛡 Что это такое?
Это перехватчик (Interceptor), который работает по принципу Аспектно-Ориентированного Программирования (AOP). Он "сидит" над всеми вашими контроллерами и ловит исключения, которые вылетели из них, прежде чем они дойдут до пользователя.
🛠 Как настроить? (3 шага)
1. Создаем DTO для ошибки
Нам нужен красивый формат ответа, чтобы фронтенд всегда знал, чего ожидать.
public record ErrorResponse(int statusCode, String message, LocalDateTime timestamp) {}
2. Создаем Глобальный Обработчик
Используем аннотацию
@RestControllerAdvice. Это тот же @ControllerAdvice, но он автоматически добавляет @ResponseBody ко всем ответам (мы же пишем REST API).Внутри класса мы пишем методы-обработчики с аннотацией
@ExceptionHandler.
@RestControllerAdvice
public class GlobalExceptionHandler {
// 1. Ловим конкретную ошибку (например, сущность не найдена)
@ExceptionHandler(EntityNotFoundException.class)
public ResponseEntity<ErrorResponse> handleNotFound(EntityNotFoundException ex) {
return ResponseEntity
.status(HttpStatus.NOT_FOUND)
.body(new ErrorResponse(404, ex.getMessage(), LocalDateTime.now()));
}
// 2. Ловим ошибки валидации (если передали кривой JSON)
@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity<ErrorResponse> handleValidation(MethodArgumentNotValidException ex) {
String errors = ex.getBindingResult().getFieldErrors().stream()
.map(e -> e.getField() + ": " + e.getDefaultMessage())
.collect(Collectors.joining(", "));
return ResponseEntity
.status(HttpStatus.BAD_REQUEST)
.body(new ErrorResponse(400, errors, LocalDateTime.now()));
}
// 3. Ловим всё остальное (Fallback)
@ExceptionHandler(Exception.class)
public ResponseEntity<ErrorResponse> handleAll(Exception ex) {
return ResponseEntity
.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse(500, "Произошла внутренняя ошибка", LocalDateTime.now()));
}
}
3. Бросаем исключения в Сервисе
Теперь в коде сервиса можно не бояться и просто бросать ошибки. Обработчик их поймает.
public User getUser(Long id) {
return repo.findById(id)
.orElseThrow(() -> new EntityNotFoundException("User with id " + id + " not found"));
}
⚡ Почему это круто?
1. Чистота кода: В контроллерах нет
try-catch блоков. Только "счастливый путь" (happy path).2. Единообразие: Весь API возвращает ошибки в одинаковом формате.
3. Безопасность: Вы контролируете, какой текст ошибки увидит пользователь, и скрываете системные детали.
🔥 Итог
try-catch в контроллерах.@RestControllerAdvice.EntityNotFoundException) на HTTP-статусы (404 Not Found).#SpringBoot #Java #ExceptionHandling #BestPractices
📲 Мы в MAX
👉@BookJava
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🔥1