Spring AOP: аннотации pointcut не вызывают рекомендации для выполнения - PullRequest
4 голосов
/ 08 декабря 2011

Я использую Spring AOP (с поддержкой стилей аннотаций AspectJ) и хочу выполнить код, если метод аннотирован конкретной аннотацией (WsTransaction).

Вот мой аспект:

@Aspect
@Component
public class ExampleAspect {

    @Pointcut("execution(* example.*.ws.*.*(..))")
    public void isWebService() {}

    @Pointcut("@annotation(example.common.ws.WsTransaction)")
    public void isAnnotated() {}

    @Before("isWebService() && isAnnotated()")
    public void before() {
        System.out.println("before called");
    }
}

Это пример класса, где я ожидаю его запуска:

package example.common.ws;

@Endpoint
public class SomeEndpoint {

    @WsTransaction() // I want advice to execute if this annotation present
    @PayloadRoot(localPart = "SomeRequest", namespace = "http://example/common/ws/")
    public SomeResponse methodToBeCalled(SomeRequest request) {
            // Do stuff
            return someResponse;
    }
}

Когда я изменяю @Before на использование только isWebService(), он вызывается, но когда я пробую его с isWebService() && isAnnotated()или просто isAnnotated(), кажется, ничего не происходит.

У меня есть <aop:aspectj-autoproxy/> в моей конфигурации Spring.

Конечная точка создана Spring (с использованием component-scan).

Политика хранения аннотации - время выполнения.

Версия Spring - 3.0.3.RELEASE

Я не уверен, что не так или что я могу попробовать отладить.

Обновление: оноПохоже, Spring AOP не принимает аннотированные классы @Endpoint

Обновление 2: AopUtils.isAopProxy(this) и AopUtils.isCglibProxy(this) оба false (даже при использовании <aop:aspectj-autoproxy proxy-target-class="true"/>)

Ответы [ 2 ]

2 голосов
/ 12 декабря 2011

Во-первых, мне пришлось использовать <aop:aspectj-autoproxy proxy-target-class="true"/>, чтобы использовать прокси на основе классов (CGLIB) (вместо прокси на основе интерфейса Java).

Во-вторых (и это то, где я застрял), мне пришлось указатьвыше в contextConfigLocation сервлета, обрабатывающего запросы SOAP (MessageDispatcherServlet) вместо контекста корневого приложения.

0 голосов
/ 08 декабря 2011

Я полагаю, что может быть некоторая проблема с объявлением pointcut.

  @Pointcut("@annotation(example.common.ws.WsTransaction)")

См. эту ссылку для возможного решения

...