Глобальна обробка виключень за допомогою @ControllerAdvice
Централізоване оброблення помилок валідації робить код чистішим та зручнішим для підтримки.
Ви можете використовувати @ControllerAdvice
та @ExceptionHandler
для глобальної обробки помилок валідації в усіх контролерах.
import org.springframework.http.HttpStatus;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.validation.BindingResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.HashMap;
import java.util.Map;
import org.springframework.util.AnnotationUtils;
@ControllerAdvice
public class GlobalExceptionHandler {
private static final Logger LOGGER = LoggerFactory.getLogger(GlobalExceptionHandler.class);
/**
* Обробляє всі невідомі виключення.
*
* @param e виключення
* @return мапа, що містить повідомлення про помилку
*/
@ExceptionHandler(Exception.class)
@ResponseBody
public Map handleException(Exception e) throws Exception {
LOGGER.error(e.getMessage(), e);
// Якщо виключення анотоване @ResponseStatus, перекидаємо виключення для обробки з кодом статусу.
if (AnnotationUtils.findAnnotation(e.getClass(), ResponseStatus.class) != null) {
throw e;
}
Map result = new HashMap<>();
result.put("Повідомлення про помилку: ", e.getMessage());
return result;
}
/**
* Обробляє бізнес-специфічні виключення.
*
* @param e бізнес-виключення
* @return мапа, що містить повідомлення про помилку
*/
@ExceptionHandler(UserNotExistException.class)
@ResponseBody
public Map handleBusinessException(UserNotExistException e) {
LOGGER.error(e.getMessage(), e);
Map result = new HashMap<>();
result.put("Повідомлення про помилку: ", e.getMessage());
return result;
}
/**
* Обробляє помилки валідації з аргументів методів.
*
* @param e виключення валідації
* @return мапа, що містить повідомлення про помилки валідації
*/
@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseBody
public Map handleMethodArgumentNotValidException(MethodArgumentNotValidException e) {
LOGGER.error(e.getMessage(), e);
Map result = new HashMap<>();
String messages = "";
// Проходимо по всіх помилках валідації і конкатенуємо їх повідомлення.
for (ObjectError objectError : e.getBindingResult().getAllErrors()) {
messages += objectError.getDefaultMessage() + ",";
}
result.put("Повідомлення про помилку: ", messages);
return result;
}
}
Це дозволить перехоплювати всі помилки валідації в вашому додатку, спрощуючи управління відповідями про помилки.
Загальні анотації для валідації
Ось деякі часто використовувані анотації Hibernate Validator:
@NotBlank
: Перевіряє, що поле не є порожнім або null.@NotNull
: Перевіряє, що поле не є null.@Min
: Визначає мінімальне значення.@Max
: Визначає максимальне значення.@Size
: Перевіряє розмір рядка або масиву.@Email
: Перевіряє, чи є поле дійсною електронною адресою.@Length
: Перевіряє довжину рядка (використовується для складніших випадків).
Висновок
Інтеграція Hibernate Validator з Spring Boot надає потужні інструменти для валідації введених користувачем даних як на рівні класу, так і методу.
Використовуючи можливості, такі як кастомізовані повідомлення про помилки, групова валідація та глобальна обробка виключень, ви можете побудувати чисту та зручну для підтримки логіку валідації. Незалежно від того, створюєте ви невеликий додаток чи велике корпоративне рішення, ці техніки валідації гарантують, що ваш додаток обробляє введення користувача безпечно та ефективно.
Дотримуючись цих практик, ваші Spring Boot додатки стануть більш надійними, і ви зменшите ризик потрапляння некоректних даних у вашу систему. Успіхів у кодингу!
Перекладено з: Integrating Hibernate Validation in Spring Boot for Advanced Parameter Validation — Global Exception Handling