Details
-
Type:
Bug
-
Status: Closed
-
Priority:
Minor
-
Resolution: Complete
-
Affects Version/s: 5.0.6
-
Labels:
-
Last commented by a User:true
Description
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()
Attachments
Issue Links
- is related to
-
SPR-17003 Spring 5.x DataSource proxying does not work with Oracle UCP on JDK 9+
-
- Closed
-
- relates to
-
SPR-16723 AspectJ execution pointcut does not detect methods in superinterface anymore
-
- Closed
-
-
SPR-16757 AopUtils.getMostSpecificMethod should expose dynamic proxy class methods
-
- Closed
-
-
SPR-16677 Mixed use BeanNameAutoProxyCreator and AnnotationAwareAspectJAutoProxyCreator to proxy same bean
-
- Closed
-