Yanming Zhou opened SPR-16803 and commented
If target object is JDK dynamic proxy, Aspectj annotation pointcut match failed since proxy class method lost annotations, here is a simple test
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertNotNull;
import java.lang.reflect.Method;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import org.junit.Test;
import org.springframework.aop.framework.ProxyFactory;
import org.springframework.aop.support.AopUtils;
import org.springframework.transaction.annotation.Transactional;
public class AopUtilsTest {
@Test
public void getMostSpecificMethod() throws Exception {
MyInterface proxy = (MyInterface) new ProxyFactory(MyInterface.class, new MyMethodInterceptor())
.getProxy(MyInterface.class.getClassLoader());
Method interfaceMethod = MyInterface.class.getMethod("test");
Method proxyMethod = proxy.getClass().getMethod("test");
Method mostSpecificMethod = AopUtils.getMostSpecificMethod(interfaceMethod, proxy.getClass());
assertNotEquals(proxyMethod, interfaceMethod);
assertEquals(interfaceMethod, mostSpecificMethod); //failed
assertNotNull(mostSpecificMethod.getAnnotation(Transactional.class));
}
public static interface MyInterface {
@Transactional
public String test();
}
public static class MyMethodInterceptor implements MethodInterceptor {
@Override
public Object invoke(MethodInvocation mi) throws Throwable {
return null;
}
}
}
We should add a short-circuit
if(Proxy.isProxyClass(targetClass))
return method;
I'm not sure this change should apply for AopUtils.getMostSpecificMethod() or ClassUtils.getMostSpecificMethod()
Affects: 5.0.6
Attachments:
Issue Links:
Referenced from: commits bba5dca, 416dee7
Yanming Zhou opened SPR-16803 and commented
If target object is JDK dynamic proxy, Aspectj annotation pointcut match failed since proxy class method lost annotations, here is a simple test
We should add a short-circuit
I'm not sure this change should apply for AopUtils.getMostSpecificMethod() or ClassUtils.getMostSpecificMethod()
Affects: 5.0.6
Attachments:
Issue Links:
Referenced from: commits bba5dca, 416dee7