Разработчик REST API будет иметь два требования, связанных с обработкой ошибок.
- Общее место для обработки ошибок
- Аналогичное тело ответа об ошибке с правильным кодом состояния HTTP через API
Оба требования могут быть выполнены с помощью аннотации RestControllerAdvice в Spring.
См. Код по адресу https://github.com/DharmendraRathor/springzone/tree/master/customer .
Я создал Получить обслуживание клиентов для ресурса клиента.
Джава
1
2
"/customer") (
3
public class CustomerController {
4
6
private CustomerManager customerManager;
7
"/{id}") (
9
public Customer getCustomer( String id) {
10
return customerManager.getCustomer(id).orElseThrow(() -> new NotFoundException("Customer not found with id " + id));
11
}
12
}
curl --request GET --url http: // localhost: 8080 / customer / 1
Джава
xxxxxxxxxx
1
If customer does not exist in DB , I want to throw error message with http Status 404.
2
{
4
"errorCode": "NOT_FOUND_ERROR",
5
"errorMsg": "Customer not found with id 1",
6
"status": 404,
7
"timestamp": "2019-12-26 11:45:59"
8
}
9
Чтобы достичь этого, мы должны определить глобальный класс обработчика исключений с помощью аннотации @RestControllerAdvice.
Вы также можете быть заинтересованы в: Глобальная обработка исключений с @ControllerAdvice
Мы добавили один метод handleGenericNotFoundException, который обрабатывает исключения, определенные с помощью
@ExceptionHandler (значение = NotFoundException. Класс ).
Любая служба, генерирующая исключение «NotFoundException», попадает в метод handleGenericNotFoundException, а метод переносит исключение в общем формате, используя класс «CustomErrorResponse». В этом случае выдается ошибка «клиент не найден», как определено в методе handleGenericNotFoundException внутри класса ExceptionAdvice.
xxxxxxxxxx
1
2
public class ExceptionAdvice {
3
value = NotFoundException.class) (
5
public ResponseEntity<CustomErrorResponse> handleGenericNotFoundException(NotFoundException e) {
6
CustomErrorResponse error = new CustomErrorResponse("NOT_FOUND_ERROR", e.getMessage());
7
error.setTimestamp(LocalDateTime.now());
8
error.setStatus((HttpStatus.NOT_FOUND.value()));
9
return new ResponseEntity<>(error, HttpStatus.NOT_FOUND);
10
}
11
}
CustomErrorResponse можно найти в CustomErrorResponse .
Мы можем определить несколько методов обработчика ошибок для различных типов исключений, сгенерированных службами в классе «ExceptionAdvice», и обернуть каждый из них с помощью общего ответа CustomErrorResponse. Это гарантирует, что у нас есть общее место для обработки ошибок, и все службы возвращают одинаковые ответы об ошибках.
Git репо для всего проекта git project .