Я использую 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"/>
)