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