Обробка Винятків
Обробка виключень у REST API за допомогою Spring Boot — це важливий аспект розробки, який забезпечує ефективне керування помилками та інформування клієнтів про проблеми, що виникли на сервері. Розглянемо цей процес більш детально.
Як це допомагає повідомляти клієнта про помилки?
Обробка помилок у REST API допомагає стандартизувати формат відповідей про помилки, що спрощує роботу клієнтів із цими відповідями. Це, у свою чергу, інформує їх про причини помилок, дозволяючи клієнтам зрозуміти, що сталося не так, і як виправити проблему.
Крім того, така обробка дозволяє розрізняти типи помилок, наприклад, помилки валідації або проблеми з доступом, роблячи повідомлення про помилки більш точними та корисними.
Реалізація обробки виключень за допомогою анотацій
Spring Boot надає кілька інструментів для обробки винятків. Основними є анотації @ControllerAdvice та @ExceptionHandler.
Анотація @ControllerAdvice дозволяє визначати глобальні обробники винятків для всіх контролерів у застосунку, що допомагає централізувати обробку помилок та уникати дублювання коду.
У класі, позначеному анотацією @ControllerAdvice, методи, позначені анотацією @ExceptionHandler, визначають, які типи винятків має обробляти конкретний метод. Це спрощує керування помилками та робить код чистішим і більш організованим.
GlobalExceptionHandler.java
12345678@ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(ApiException.class) public ResponseEntity<?> handleException(ApiException ex) { // error handling } }
У цій класі метод handleException() буде викликаний, коли у застосунку виникне виняток типу ApiException. Анотація @ExceptionHandler(ApiException.class) вказує, що цей метод обробляє винятки цього конкретного типу.
Створення власного винятку
Що ж таке ApiException? Це користувацький виняток, створений спеціально для нашого API. Ми можемо створювати власні винятки та використовувати їх у нашому REST API.
Дізнатися більше про створення власних користувацьких винятків можна тут.
ApiException.java
12345678910111213141516public class ApiException extends RuntimeException { // HTTP status code associated with this exception private final HttpStatus httpStatus; // Constructor to initialize the exception with a message and an HTTP status public ApiException(String message, HttpStatus httpStatus) { super(message); this.httpStatus = httpStatus; } // Getter method to retrieve the HTTP status public HttpStatus getHttpStatus() { return httpStatus; } }
Цей код визначає клас ApiException, який наслідує RuntimeException та містить додаткове поле httpStatus для зберігання HTTP-статусу. Конструктор класу приймає повідомлення та HTTP-статус, які передаються у базовий конструктор і зберігаються у полі httpStatus.
Після цього ми можемо кидати виняток у нашому застосунку:
Main.java
1234567891011public BookResponseDTO updateBook(String id, BookRequestDTO book) { Book modelBook = MapperBook.dtoRequestToModel(book); Book repositoryBook = bookRepository.updateBook(id, modelBook); // If the book was not found in the repository, throw an ApiException with a NOT_FOUND status if (repositoryBook == null) { throw new ApiException("Not found book by id: " + id, HttpStatus.NOT_FOUND); } return MapperBook.modelToResponseDto(repositoryBook); }
Цей тип виключення буде перехоплений методом handleException(ApiException ex) , який призначений для обробки цього виключення, і в межах цього методу ми можемо визначити логіку для керування цим виключенням.
Логіка, яку необхідно реалізувати, полягає у перехопленні виключень, пов'язаних з API, та поверненні структурованої відповіді, що містить інформацію про помилку разом із відповідним HTTP-статусом.
Main.java
123456789@ExceptionHandler(ApiException.class) public ResponseEntity<?> handleException(ApiException ex) { return new ResponseEntity<>(ErrorResponse .builder() .error(ex.getMessage()) .build(), ex.getHttpStatus() ); }
Цей код обробляє ApiException, створюючи ResponseEntity з інформацією про помилку. Метод handleException() формує об'єкт ErrorResponse з повідомленням з винятку та встановлює HTTP-статус з поля httpStatus винятку, повертаючи це клієнту.
Ми ініціалізували поле httpStatus, коли генерували виняток у нашому додатку.
ErrorResponse — це клас, який використовується для надання інформації про помилку. Він містить поле error, що відображає опис помилки, і створюється за допомогою анотацій @Data та @Builder.
ErrorResponse.java
12345@Data @Builder public class ErrorResponse { private String error; }
Анотація @Builder з Lombok спрощує створення об'єктів, реалізуючи патерн Builder. Вона забезпечує більш читабельний та зручний для підтримки спосіб конструювання об'єктів, особливо тих, що мають багато параметрів. Наприклад, можна створити екземпляр ErrorResponse таким чином:
ErrorResponse.builder().error("ERROR").build();
Метод builder() ініціалізує новий builder для класу ErrorResponse. Метод error("ERROR") встановлює поле error у значення "ERROR", а метод build() створює фінальний об'єкт ErrorResponse із вказаним значенням.
Обробка помилок у нашому застосунку
Підсумок
Обробка винятків у REST API централізує керування помилками, забезпечуючи єдиний формат відповіді для клієнта. Це спрощує розуміння та обробку помилок, оскільки клієнти отримують чіткі та структуровані повідомлення.
Використання анотацій @ControllerAdvice та @ExceptionHandler дозволяє налаштовувати спосіб обробки різних винятків, а власні винятки можуть містити додаткову інформацію, таку як HTTP-статус.
Дякуємо за ваш відгук!
Запитати АІ
Запитати АІ
Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат
Awesome!
Completion rate improved to 3.45
Обробка Винятків
Свайпніть щоб показати меню
Обробка виключень у REST API за допомогою Spring Boot — це важливий аспект розробки, який забезпечує ефективне керування помилками та інформування клієнтів про проблеми, що виникли на сервері. Розглянемо цей процес більш детально.
Як це допомагає повідомляти клієнта про помилки?
Обробка помилок у REST API допомагає стандартизувати формат відповідей про помилки, що спрощує роботу клієнтів із цими відповідями. Це, у свою чергу, інформує їх про причини помилок, дозволяючи клієнтам зрозуміти, що сталося не так, і як виправити проблему.
Крім того, така обробка дозволяє розрізняти типи помилок, наприклад, помилки валідації або проблеми з доступом, роблячи повідомлення про помилки більш точними та корисними.
Реалізація обробки виключень за допомогою анотацій
Spring Boot надає кілька інструментів для обробки винятків. Основними є анотації @ControllerAdvice та @ExceptionHandler.
Анотація @ControllerAdvice дозволяє визначати глобальні обробники винятків для всіх контролерів у застосунку, що допомагає централізувати обробку помилок та уникати дублювання коду.
У класі, позначеному анотацією @ControllerAdvice, методи, позначені анотацією @ExceptionHandler, визначають, які типи винятків має обробляти конкретний метод. Це спрощує керування помилками та робить код чистішим і більш організованим.
GlobalExceptionHandler.java
12345678@ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(ApiException.class) public ResponseEntity<?> handleException(ApiException ex) { // error handling } }
У цій класі метод handleException() буде викликаний, коли у застосунку виникне виняток типу ApiException. Анотація @ExceptionHandler(ApiException.class) вказує, що цей метод обробляє винятки цього конкретного типу.
Створення власного винятку
Що ж таке ApiException? Це користувацький виняток, створений спеціально для нашого API. Ми можемо створювати власні винятки та використовувати їх у нашому REST API.
Дізнатися більше про створення власних користувацьких винятків можна тут.
ApiException.java
12345678910111213141516public class ApiException extends RuntimeException { // HTTP status code associated with this exception private final HttpStatus httpStatus; // Constructor to initialize the exception with a message and an HTTP status public ApiException(String message, HttpStatus httpStatus) { super(message); this.httpStatus = httpStatus; } // Getter method to retrieve the HTTP status public HttpStatus getHttpStatus() { return httpStatus; } }
Цей код визначає клас ApiException, який наслідує RuntimeException та містить додаткове поле httpStatus для зберігання HTTP-статусу. Конструктор класу приймає повідомлення та HTTP-статус, які передаються у базовий конструктор і зберігаються у полі httpStatus.
Після цього ми можемо кидати виняток у нашому застосунку:
Main.java
1234567891011public BookResponseDTO updateBook(String id, BookRequestDTO book) { Book modelBook = MapperBook.dtoRequestToModel(book); Book repositoryBook = bookRepository.updateBook(id, modelBook); // If the book was not found in the repository, throw an ApiException with a NOT_FOUND status if (repositoryBook == null) { throw new ApiException("Not found book by id: " + id, HttpStatus.NOT_FOUND); } return MapperBook.modelToResponseDto(repositoryBook); }
Цей тип виключення буде перехоплений методом handleException(ApiException ex) , який призначений для обробки цього виключення, і в межах цього методу ми можемо визначити логіку для керування цим виключенням.
Логіка, яку необхідно реалізувати, полягає у перехопленні виключень, пов'язаних з API, та поверненні структурованої відповіді, що містить інформацію про помилку разом із відповідним HTTP-статусом.
Main.java
123456789@ExceptionHandler(ApiException.class) public ResponseEntity<?> handleException(ApiException ex) { return new ResponseEntity<>(ErrorResponse .builder() .error(ex.getMessage()) .build(), ex.getHttpStatus() ); }
Цей код обробляє ApiException, створюючи ResponseEntity з інформацією про помилку. Метод handleException() формує об'єкт ErrorResponse з повідомленням з винятку та встановлює HTTP-статус з поля httpStatus винятку, повертаючи це клієнту.
Ми ініціалізували поле httpStatus, коли генерували виняток у нашому додатку.
ErrorResponse — це клас, який використовується для надання інформації про помилку. Він містить поле error, що відображає опис помилки, і створюється за допомогою анотацій @Data та @Builder.
ErrorResponse.java
12345@Data @Builder public class ErrorResponse { private String error; }
Анотація @Builder з Lombok спрощує створення об'єктів, реалізуючи патерн Builder. Вона забезпечує більш читабельний та зручний для підтримки спосіб конструювання об'єктів, особливо тих, що мають багато параметрів. Наприклад, можна створити екземпляр ErrorResponse таким чином:
ErrorResponse.builder().error("ERROR").build();
Метод builder() ініціалізує новий builder для класу ErrorResponse. Метод error("ERROR") встановлює поле error у значення "ERROR", а метод build() створює фінальний об'єкт ErrorResponse із вказаним значенням.
Обробка помилок у нашому застосунку
Підсумок
Обробка винятків у REST API централізує керування помилками, забезпечуючи єдиний формат відповіді для клієнта. Це спрощує розуміння та обробку помилок, оскільки клієнти отримують чіткі та структуровані повідомлення.
Використання анотацій @ControllerAdvice та @ExceptionHandler дозволяє налаштовувати спосіб обробки різних винятків, а власні винятки можуть містити додаткову інформацію, таку як HTTP-статус.
Дякуємо за ваш відгук!