Uploaded image for project: 'Spring Framework'
  1. Spring Framework
  2. SPR-16803

AspectJ annotation pointcuts fail to evaluate against interface-based proxies

    Details

    • 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

            Activity

              People

              • Assignee:
                juergen.hoeller Juergen Hoeller
                Reporter:
                quaff Yanming Zhou
                Last updater:
                Juergen Hoeller
              • Votes:
                0 Vote for this issue
                Watchers:
                2 Start watching this issue

                Dates

                • Created:
                  Updated:
                  Resolved:
                  Days since last comment:
                  22 weeks, 5 days ago