у меня есть два аспекта: один для получения блокировки @Around вызова, другой для устранения дребезга вызовов метода. аспекты выглядят так:
@Pointcut("execution(public * * (..))")
private void anyPublicMethod() {}
@Around("anyPublicMethod() && @annotation(lock)")
public Object all(ProceedingJoinPoint proceedingJoinPoint, Lock lock) throws Throwable {
// acquire lock, then proceed()
}
а другой выглядит так:
@Pointcut("execution(public * * (..))")
private void anyPublicMethod() {}
@Around("anyPublicMethod() && @annotation(debounce)")
public Object all(ProceedingJoinPoint proceedingJoinPoint, Debounce debounce) throws Throwable {
// debouncing as described in
// http://stackoverflow.com/questions/4742210/implementing-debounce-in-java
}
полный код:
и
когда я помещаю в метод как @Debounce, так и @Lock, я получаю это исключение:
Required to bind 2 arguments, but only bound 1 (JoinPointMatch was NOT bound in invocation)
at org.springframework.aop.aspectj.AbstractAspectJAdvice.argBinding(AbstractAspectJAdvice.java:584)
at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:610)
at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:68)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:168)
at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:85)
кажется, это связано с тем, что Spring AOP не может понять, что следующая вещь, которую нужно вызвать в очереди, является еще одним аспектом, а не фактической целью, и я видел другие отчеты из Spring AOP 2 и 3 ... но я использую:
spring 4.1.1.RELEASE
pjp.proceed()
, если вам действительно не нужно манипулировать параметрами метода? Вы используетеpjp.proceed(pjp.getArgs())
вLockAspect
- person beerbajay   schedule 08.05.2015