2013-08-21 3 views
12

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

+1

Вы смогли это решить? Я столкнулся с той же проблемой, что и вы. –

ответ

6

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

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

+0

Это кажется правдой, хотя тестирование - это совсем другая проблема. – bschlueter

14

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

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

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

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

+0

Это имеет смысл, почему он не работает. Я провешу его сегодня вечером и посмотрю, работает ли он. – Joe

+0

ОЗНАКОМЬТЕСЬ! Он работает из коробки, но эта аннотация необходима, когда вы тестируете устройство! – Chexpir

+2

Также убедитесь, что это находится в файле контекста webmvc, а не в главном контексте приложения. –

7

Для этой задачи Первое подтверждает свой конфиг,

  1. Вы должны убедиться, что @ControllerAdvice класса под компонент сканирования базового пакета.
  2. Сделайте 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 ,

+0

В моем случае @EnableWebMvc было достаточно –

+0

Вы также можете добавить класс ControllerAdvice в standaloneSetup: 'MockMvcBuilders.standaloneSetup (новый MyController (myService)) .setControllerAdvice (новый MyControllerAdvice()). Build();' –

2

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

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

Это прямо-таки инициализировать класс советов контроллера и тест Junit должен иметь возможность перейти в методы @ExceptionHandler, определенных в классе советов контроллера.

0

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

Как я был в состоянии сделать это рабочим было,

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

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

Смежные вопросы