Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [aspectj-users] Circular advice precedence and same Advice class

Change the advice order to after/before/around:

@Aspect
abstract class ProfilingAbstractAspect {

    @Pointcut
    public abstract void afterScope();

    @Pointcut
    public abstract void beforeScope();

    @Pointcut
    public abstract void aroundScope();

    @After("afterScope()")
    public void afterProfile() {
        System.out.println("after");
    }

    @Before("beforeScope()")
    public void beginProfile(JoinPoint jp) {
        System.out.println("before");
    }

    @Around("aroundScope()")
    public Object aroundProfile(ProceedingJoinPoint pjp) throws Throwable {
        System.out.println("around");
        return pjp.proceed();
    }
}

There is some discussion of this here:

http://dev.eclipse.org/mhonarc/lists/aspectj-users/msg02138.html
and links to bugs from the post following that:
https://bugs.eclipse.org/bugs/show_bug.cgi?id=30439
https://bugs.eclipse.org/bugs/show_bug.cgi?id=40655

Andy

2009/7/16 Dan Becker <dan.o.becker@xxxxxxxxx>
How does one get rid the circular advice precedence error when the pointcut points to a single method, and the concrete-aspect comes from a single Advice class?

The error:
"error at myPath\ProfilingAbstractAspect.java::0 circular advice precedence: can't determine precedence between two or more pieces of advice that apply to the same join point"

The advice class:
@Aspect
public abstract class ProfilingAbstractAspect {
   @Pointcut
   public abstract void beforeScope();
   @Pointcut
   public abstract void afterScope();
   @Pointcut
   public abstract void aroundScope();

   @Before("beforeScope()")
   public void beginProfile(JoinPoint jp) {
   ...
   }
   @After("afterScope()")
   public void afterProfile() {
   ...
   }
   @Around("aroundScope()")
   public Object aroundProfile(ProceedingJoinPoint pjp) throws Throwable {
    ...
   }
}


The aop.xml definition of concrete aspects and join point:
   <aspects>
       <concrete-aspect name="myPath.ProfilingServlet"
          extends="myPath.ProfilingAbstractAspect">
          <pointcut name="beforeScope" _expression_="execution(* myPath.Servlet.doService(..))"
             precedence="myPath.ProfilingAbstractAspect,*"/>
          <pointcut name="afterScope" _expression_="execution(* myPath.Servlet.doService(..))"
             precedence="myPath.ProfilingAbstractAspect,*"/>
          <pointcut name="aroundScope" _expression_="execution(* myPath.Servlet.doService(..))"
             precedence="myPath.ProfilingAbstractAspect,*"/>       </concrete-aspect>
   </aspects>

--
Thanks, Dan
_______________________________________________
aspectj-users mailing list
aspectj-users@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/aspectj-users


Back to the top