Skip to content

AspectJ annotation pointcuts fail to evaluate against interface-based proxies [SPR-16803] #21343

Closed
@spring-projects-issues

Description

@spring-projects-issues

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

Metadata

Metadata

Assignees

Labels

in: coreIssues in core modules (aop, beans, core, context, expression)type: regressionA bug that is also a regression

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions