Моя цель — реализовать централизованную стратегию обработки ошибок, которая охватывает:
- Бизнес-исключения: Сопоставление кодов состояния 4xx/5xx с пользовательскими исключениями.
- Контекстные данные: Я хочу, чтобы мои пользовательские исключения содержали исходную PathVariable (или параметры запроса), чтобы облегчить регистрацию и отладку в @ControllerAdvice.
- Отказы устойчивости: Обработка тайм-аутов и ошибок 503 (часто заключенных в RetryableException Feign) без потери возможности активировать автоматический выключатель.
Feign оборачивает большинство сетевых проблем в исключение RetryableException. Кроме того, я изо всех сил пытаюсь найти лучший способ извлечь определенную PathVariable из запроса при возникновении ошибки, чтобы я мог создать экземпляр своего собственного исключения с этим контекстом (например, UserNotFoundException(userId)).
Код: Выделить всё
@FeignClient(name = "user-service", configuration = FeignConfig.class)
public interface UserClient {
@GetMapping("/users/{id}")
UserResponse getUserById(@PathVariable("id") String id);
}
- Как реализовать ErrorDecoder, который извлекает {id из пути запроса и включает его в пользовательское исключение?
- Как лучше всего обрабатывать эти исключения централизованно? Должен ли я позволить ErrorDecoder генерировать исключение и перехватывать его в @RestControllerAdvice?
- Как выключатель Resilience4j взаимодействует с пользовательскими исключениями, создаваемыми ErrorDecoder? Нужно ли мне явно указывать Resilience4j, какие исключения должны (или не должны) вызывать изменение состояния?
Мобильная версия