ВЕСНА ЗАГРУЗКА - Обработка исключения HttpClientErrorException с помощью @ControllerAdvice

У меня есть 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 не работает. Программа по-прежнему выдает исключение. Кто-нибудь может объяснить?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
1 650
2

Ответы 2

@ControllerAdvice(basePackages = Service.class)

Исключение передается в класс @Controller, а @ControllerAdvice должен применяться к контроллеру, поэтому вы должны установить basePackageClasses в свой пакет контроллера, а не в сервисный пакет.

По умолчанию @ControllerAdvice применяется ко всем Контроллерам, поэтому вы можете удалить basePackageClasses, если не хотите сузить список контроллеров.

Да, я понял, что вы пытаетесь сказать, и внес необходимые изменения, как вы предложили, но он все еще не обрабатывает исключение. :(

neha 14.05.2018 14:03

Я тоже столкнулся с подобной проблемой,

попробуйте добавить @Order(Ordered.HIGHEST_PRECEDENCE) ниже @ControllerAdvice.

Мы добавляем его, чтобы получить приоритет над DefaultHandlerExceptionResolver Spring по умолчанию. Чтобы понять, почему мы добавили его, прочтите этот ответ. Также не нужно указывать базовые пакеты, по умолчанию будут учитываться все пакеты.

Чтобы обработать исключение любого другого типа, вы можете включить ниже существующий обработчик исключений для HttpClientErrorException, который вы уже написали,

@ExceptionHandler(Exception.class)
public Strring handleAnyExceptions(Exception ex) {
    return "your message";
} 

Надеюсь, поможет !

Я пробовал ваше решение, но оно все еще не обрабатывает исключение.

neha 14.05.2018 14:02

Хорошо, а зачем вам @ Slf4j @EnableWebMvc в HttpClientErrorHandler? Пожалуйста, попробуйте удалить их и попробуйте установить точку останова отладки в HttpClientErrorHandler при возникновении исключения. попробуйте и проверьте, помогает ли это.

rdj7 14.05.2018 15:41

Другие вопросы по теме