Spring 3.2 @ControllerAdvice не работает

У меня возникли проблемы с работой @ControllerAdvice. Я обновил свое пространство имен, которое было 3.1 в моих xml файлах. Я переместил класс с контроллером в тот же пакет, что и контроллер. Я использую выпускные банеры 3.2.0. Если я помещаю аннотацию @ExceptionHandler в код контроллера, она работает, но не в отдельном классе с @ControllerAdvice. Когда класс @ControllerAdvice выходит из строя, я получаю свой обработчик обработчика исключаемых исключений. У кого-нибудь есть идеи о том, как устранить эту проблему?

Ответ 1

Дополнительной конфигурации не требуется. Он должен просто работать. Посмотрите на эту ссылку для получения более подробной информации. Это очень простой пример:

http://www.javabeat.net/2013/10/exception-controlleradvice-spring-3-2/

Ответ 2

Если вы используете сканирование классов, возможно, вам нужно добавить новый фильтр include к элементу <context:component-scan>:

<context:include-filter type="annotation" 
    expression="org.springframework.web.bind.annotation.ControllerAdvice" />

Сканирование по умолчанию не ищет эту аннотацию, следуя spring -context-3.2.xsd для component-scan:

"Сканирует путь к классу для аннотированных компонентов, который будет автоматически зарегистрирован как Spring beans. По умолчанию будут обнаружены стереотипы spring -provided @Component, @Repository, @Service и @Controller."

Ответ 3

Для этой проблемы первое, что подтверждает ваш конфиг,

  • Вам нужно убедиться, что класс @ControllerAdvice под базовым пакетом компонентного сканирования.
  • Создайте suer, используя <mvc:annotation-driven/> в spring -servlet.xml. или @EnableWebMvc в вашем классе @ControllerAdvice

Когда вы правильно настроите конфигурацию, ControllerAdvice уже должен работать. Теперь вы сказали, что у вас есть ваш обработчик обработчика исключенных исключений. Я думаю, вы получили это в своем InegrationTest, и вы использовали mockMvc для проверки этого. Если это так, вам нужно поставить @WebAppConfiguration и построить mokcMvc следующим образом:

 @Autowired
private WebApplicationContext wac;

mockMvc = MockMvcBuilders.webAppContextSetup(wac).build();

Использование standaloneSetup (контроллер) не будет работать из-за отсутствия WebApplicationContext.

Ответ 4

Я боролся с той же проблемой, когда мой класс @ControllerAdvice не загружался при модульных исключениях контроллеров REST. Если вы используете загрузку spring (версия 4), вы можете использовать дополнительные методы, добавленные spring, для загрузки классов рекомендаций контроллера в автономной настройке ваших контроллеров.

mockMvc = MockMvcBuilders.standaloneSetup(new YourRestController().setControllerAdvice(new ControllerAdviceClass()).build();

Это немедленно инициализирует ваш класс рекомендаций контроллера, и ваш тест Junit должен быть способен перейти к методам @ExceptionHandler, определенным в классе рекомендаций вашего контроллера.

Ответ 5

Для меня @ControllerAdvice не работал любой ценой. Даже добавление @EnableWebMvc или @WebAppConfiguration не вносило никаких изменений.

Как я мог заставить его работать,

  • добавление методов @ExceptionHandler для моего класса AbstractController, класса, на который распространяются все остальные контроллеры.

Я думаю, что @ControllerAdvice должен делать то же самое, т.е. скомпилировать методы @ExceptionHandler, определенные в классе, указанном @ControllerAdvice, в обычное место, где каждый контроллер может ссылаться. Но, к сожалению, это не работало для меня.