Использование аспекта @Before в методах @Controller в Spring не работает - PullRequest
2 голосов
/ 07 апреля 2011

У меня есть веб-приложение, использующее Spring 3, где контроллеры снабжены аннотацией @Controller.Открытые методы контроллеров аннотируются с помощью @RequestMapping.Это прекрасно работает.

Теперь я хочу проверить перед вызовом любых открытых методов в контроллерах.Я создал аспект @Before, используя выражение Pointcut, которое выбирает все методы контроллера, аннотированные @RequestMapping.Я зарегистрировал аспект, используя

<aop:aspectj-autoproxy>
    <aop:include name="myAspect"/>
</aop:aspectj-autoproxy>

Проблема заключается в том, что когда я запускаю приложение и выполняю запрос для некоторого URL-адреса, обрабатываемого одним из моих контроллеров, я получаю следующее сообщение об ошибке:

"Нет адаптера для обработчика XXX: Ваш обработчик реализует поддерживаемый интерфейс, такой как Controller?"

Таким образом, контроллеры больше не работают.У кого-нибудь есть идеи как это исправить?

Ответы [ 2 ]

4 голосов
/ 07 апреля 2011

Шон Патрик Флойд прав.Есть и другой способ: переключение формы Spring Proxy AOP на CGILib.

Из Spring Reference:

Возможно принудительное использование CGLIB, в тех (надеюсь, редко)случаи, когда вам нужно сообщить метод, который не объявлен в интерфейсе, или когда вам нужно передать объект с прокси в метод как конкретный тип.

http://static.springsource.org/spring/docs/3.0.x/reference/aop.html#aop-autoproxy-force-CGLIB

Чтобы принудительно использовать прокси-серверы CGLIB, установите значение атрибута proxy-target-class элемента <aop:config> равным true: <aop:config proxy-target-class="true">

Чтобы принудительно использовать прокси-сервер CGLIB при использовании@AspectJ autoproxy, установите для атрибута proxy-target-class элемента <aop:aspectj-autoproxy> значение true: <aop:aspectj-autoproxy proxy-target-class="true"/>

Кстати: я рекомендую использовать AspectJ вместо этогоили Spring Proxy CGILib AOP. /

4 голосов
/ 07 апреля 2011

Примечание
При использовании интерфейсов контроллера (например, для проксирования AOP), убедитесь, что последовательно ставь все свои сопоставления аннотации - например, @RequestMapping и @SessionAttributes - на интерфейс контроллера вместо класс реализации.

Источник: Spring Reference> Web MVC Framework> Реализация контроллеров

...