【问题标题】:spring aop - chaining multiple aspectsspring aop - 链接多个方面
【发布时间】:2015-07-19 01:50:04
【问题描述】:

我有两个方面,一个用于获取锁定@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

【问题讨论】:

  • 除非您确实需要操作方法的参数,否则使用pjp.proceed() 不是惯例吗?你在LockAspect中使用pjp.proceed(pjp.getArgs())
  • 是的。我尝试了两种方式。同样的例外。

标签: java spring aop spring-aop spring-aspects


【解决方案1】:

对不起,我的英语很差。 你订购了Aspect Class吗?如果你没有,这个问题可能会发生

你可以试试这个,例如:

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

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

值越小,优先级越高

【讨论】:

  • 嗨。为什么会这样?我希望这两个方面都应该完全透明?
猜你喜欢
  • 1970-01-01
  • 2015-02-26
  • 2011-09-20
  • 2013-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-26
  • 2011-07-30
相关资源
最近更新 更多