Hi all,

I've bumped into an issue that I'm hoping someone here can resolve - I'm new to 
AspectJ so perhaps I'm missing the boat.  In any case,  on an @AfterReturning 
joinpoint I need to get the method's return value and the thisJoinPoint.  The 
problem I've encountered is if I add the JoinPoint argument as the 1st arg and 
specify a returning value the join is never invoked when the returning value is 
anything other than a String (and likely other java.* objects - I haven't done 
a comprehensive test).  Other combinations work and the same syntax works when 
the returning value is a String (and as I noted likely other java.* types). 
I've pasted a reproducible sample below.

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;

@Aspect
public class BustedAspectJTest {

    @Pointcut("call(public Foo.X *.findByPrimaryKey(String,boolean)) && 
args(pk,..)")
    public void facadeFindByPrimaryKeyMethodCapture(String pk) {
    }

    // this join does not work - attempts to capture both  thisJoinPoint and 
the returning value
    @AfterReturning(pointcut = "facadeFindByPrimaryKeyMethodCapture(pk)", 
returning = "dto")
    public void afterAdvicefacadeFindByPrimaryKeyMethodCapture(JoinPoint 
thisJoinPoint, String pk, Foo.X dto) {
        System.out.println("I'M NOT WORKING WITH NON-PRIMITIVE RETURN TYPES - 
facadeFindByPrimaryKeyMethodCapture - after with returning value [" + dto + "] 
and thisJoinPoint ->" + thisJoinPoint);
    }

    @Before("facadeFindByPrimaryKeyMethodCapture(pk)")
    public void beforeAdvicefacadeFindByPrimaryKeyMethodCapture(JoinPoint 
thisJoinPoint, String pk) throws Exception {
        System.out.println("facadeFindByPrimaryKeyMethodCapture before");
    }

    @AfterReturning(pointcut = "facadeFindByPrimaryKeyMethodCapture(pk)", 
returning = "dto")
    public void afterAdvicefacadeFindByPrimaryKeyMethodCapture(String pk, Foo.X 
dto) {
        System.out.println("WORKS WITH RETURN VALUE BUT WITHOUT JOINPOINT - 
facadeFindByPrimaryKeyMethodCapture - after with returning value [" + dto + "] 
and thisJoinPoint ->");
    }

    @AfterReturning(pointcut = "facadeFindByPrimaryKeyMethodCapture(pk)")
    public void afterAdvicefacadeFindByPrimaryKeyMethodCapture(JoinPoint 
thisJoinPoint, String pk) {
        System.out.println("WORKS WITH JOINPOINT BUT WITHOUT RETURN VALUE");
    }


    // following joins working in all cases
    @Pointcut("call(public String 
*.findByPrimaryKeyPrimitiveReturnType(String,boolean)) && args(pk,..)")
    public void facadeFindByPrimaryKeyStringReturnTypeMethodCapture(String pk) {
    }

    @Before("facadeFindByPrimaryKeyStringReturnTypeMethodCapture(pk)")
    public void 
beforeFacadeFindByPrimaryKeyStringReturnTypeMethodCapture(JoinPoint 
thisJoinPoint, String pk) throws Exception {
        System.out.println("--- All joins working below  --");
        System.out.println("facadeFindByPrimaryKeyStringReturnTypeMethodCapture 
before");
    }

    @AfterReturning(pointcut = 
"facadeFindByPrimaryKeyStringReturnTypeMethodCapture(pk)", returning = "dto")
    public void facadeFindByPrimaryKeyStringReturnTypeMethodCapture(JoinPoint 
thisJoinPoint, String pk, String dto) {
        System.out.println("WORKS WITH JOINPOINT AND STRING RETURN VALUE- 
facadeFindByPrimaryKeyStringReturnTypeMethodCapture after with returning value 
[" + dto + "] and thisJoinPoint ->" + thisJoinPoint);
    }
}
*****************************************************************
And here's the tester:
*****************************************************************

public class Foo {

    public Foo.X findByPrimaryKey(String x, boolean cascade) {
        return new X();
    }

    public String findByPrimaryKeyPrimitiveReturnType(String x, boolean 
cascade) {
        return "returned";
    }

    public static void main(String[] args) {
        Foo instance = new Foo();
        instance.findByPrimaryKey("x",true);
        instance.findByPrimaryKeyPrimitiveReturnType("y",true);
    }

    public class X {
      public String toString() {
          return this.getClass().getName();
      }
    }
}



Thanks,
Trey
_______________________________________________
aspectj-users mailing list
[email protected]
https://dev.eclipse.org/mailman/listinfo/aspectj-users

Reply via email to