У меня есть Java-приложение Spring Boot. Существует класс обслуживания, который выдает исключение HttpClientErrorException «401 Unauthorized», поскольку срок действия токена доступа, используемого в приложении, истек. Я хочу обработать это исключение глобально, для чего использовал аннотацию @ControllerAdvice. Ошибка:
Вызвано: org.springframework.web.client.HttpClientErrorException: 401 Unauthorized
Класс:
@Slf4j
@EnableWebMvc
@ControllerAdvice(basePackages = Service.class)
public class HttpClientErrorHandler{
@ExceptionHandler(HttpClientErrorException.class)
@ResponseStatus(HttpStatus.UNAUTHORIZED)
public String errorHandle(HttpClientErrorException e) {
log.error("log HttpClientErrorException: ", e);
return "HttpClientErrorException_message";
}
}
Поскольку исключение было вызвано в классе обслуживания, я упомянул об этом специально в basePackages. Вся конфигурация программы указана в файле application.yml. Я не использовал конфигурацию xml. Я не понимаю, почему аннотация @ControllerAdvice не работает. Программа по-прежнему выдает исключение. Кто-нибудь может объяснить?




@ControllerAdvice(basePackages = Service.class)
Исключение передается в класс @Controller, а @ControllerAdvice должен применяться к контроллеру, поэтому вы должны установить basePackageClasses в свой пакет контроллера, а не в сервисный пакет.
По умолчанию @ControllerAdvice применяется ко всем Контроллерам, поэтому вы можете удалить basePackageClasses, если не хотите сузить список контроллеров.
Я тоже столкнулся с подобной проблемой,
попробуйте добавить @Order(Ordered.HIGHEST_PRECEDENCE) ниже @ControllerAdvice.
Мы добавляем его, чтобы получить приоритет над DefaultHandlerExceptionResolver Spring по умолчанию. Чтобы понять, почему мы добавили его, прочтите этот ответ.
Также не нужно указывать базовые пакеты, по умолчанию будут учитываться все пакеты.
Чтобы обработать исключение любого другого типа, вы можете включить ниже существующий обработчик исключений для HttpClientErrorException, который вы уже написали,
@ExceptionHandler(Exception.class)
public Strring handleAnyExceptions(Exception ex) {
return "your message";
}
Надеюсь, поможет !
Я пробовал ваше решение, но оно все еще не обрабатывает исключение.
Хорошо, а зачем вам @ Slf4j @EnableWebMvc в HttpClientErrorHandler? Пожалуйста, попробуйте удалить их и попробуйте установить точку останова отладки в HttpClientErrorHandler при возникновении исключения. попробуйте и проверьте, помогает ли это.
Да, я понял, что вы пытаетесь сказать, и внес необходимые изменения, как вы предложили, но он все еще не обрабатывает исключение. :(