spring aop - объединение нескольких аспектов

у меня есть два аспекта: один для получения блокировки @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

}

полный код:

https://github.com/rmalchow/debouncer-aspect/blob/master/src/main/java/com/skjlls/aspects/debounce/impl/DebounceAspect.java

и

https://github.com/rmalchow/lock-aspect/blob/master/src/main/java/com/skjlls/aspects/lock/impl/LockAspect.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

person rmalchow    schedule 08.05.2015    source источник
comment
Разве не принято использовать pjp.proceed(), если вам действительно не нужно манипулировать параметрами метода? Вы используете pjp.proceed(pjp.getArgs()) в LockAspect   -  person beerbajay    schedule 08.05.2015
comment
да. я пробовал и так и так. такое же исключение.   -  person rmalchow    schedule 08.05.2015


Ответы (1)


извините за мой плохой английский. ты заказал Аспект класс? если вы этого не сделали, эта проблема может произойти

вы можете попробовать это, например:

@Aspect
@Order(1)
public class FirstAspect(){}

@Aspect
@Order(2)
public class SecondAspect(){}

значение ниже, приоритет выше

person runbird    schedule 25.10.2018
comment
Привет. почему это произошло? я ожидал бы, что оба аспекта должны быть полностью прозрачными? - person rmalchow; 07.01.2019