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